1.课程介绍
- Servlet三大职责; (掌握)
- Servlet重定向和请求转发; (掌握)
- JSP介绍; (了解)
- JSP语法; (掌握)
- JSP三大指令; (掌握))
- JSP九大内置对象; (了解)
- 四大作用域对象; (掌握))
- JSP动作元素; (了解)
2.Servlet交互
2.1.Servlet的三大职责
1.接收请求参数(封装)- BeanUtil类底层是反射和内省机制 ;
2.调用业务方法处理业务(去调用service业务层);
3.响应请求(跳转页面或其他Servlet);
2.2.为什么需要共享信息与页面跳转
1.为什么需要跳转和数据共享?
跳转:需要做责任分离(Servlet擅长写代码即处理业务逻辑,jsp擅长展示页面);
共享:Http是无状态的,我们跳转的时候数据无法传递,因此需要做数据共享;
2.页面跳转可以怎么跳?
Servlet跳转其它资源(jsp,html);
Serlvet跳转其他Servlet(一般来说: 最后都会跳转到页面);
3.学习跳转的方式?
请求转发;
重定向;
2.3.请求转发Forward
示例:创建两个Servlet,分别是AServlet与BServlet,然后我访问AServlet,从AServlet跳转到BServlet;(分别使用转发和重定向实现);
转发的方式:req.getRequestDispatcher(“路径”).forward(request, response);
注意:千万不要忘了forward;
代码:
(2)发送了一次请求(可以共享同一个请求对象 – 可以发请求的时候手动加一个参数)
注1:在AServlet 里面跳转之后,resp.getWriter().println(“我要显示一个东西出来”);
不会显示在页面上,因为这个resp 不会转发之后,在回AServlet里面来;
(5)可以访问到 WEB-INF中的资源:
注1:不能直接通过/locolhost/WEB-INF/haha.html进行访问:
2.4.重定向Redirect
重定向跳转的方式:resp.sendRedirect(“路径”);//直接跳转
重定向特点:
(1)地址会发生变化:
①请求的顺序,显示的依然是最后一个:
2.5.面试题
有关重定向(redirect)和转发(forword)的面试题:
1.请分别说出Forword与Redirect的特点和区别?
Forword:1次请求,可以共享同一组request和response,地址栏不会变化,不能到外部应用
Redirect:多次请求,不可以共享同一组request和response,地址栏会变化,可以到外部
2.我们在什么情况下使用哪一种跳转?
(1)如果我们需要做请求的数据共享,使用forward
(2)如果我们需要访问WEB-INF里面只有使用forward
(3)如果我们要跨域访问(访问外部程序),必须使用Redirect
3.JSP
3.1.JSP的简介
1.为了将Servlet中用于表现的部分分离出来,Java使用JSP实现;
2.JSP(java server page):java服务器端(动态)网页,JSP就是Java中用来做动态网页的技术;
3.既然是页面,对于前端代码编写人员来说,可以当成html页面来进行渲染工作;
4.JSP底层就是一个Servlet,在执行的时候先转成Servlet然后同样要经历Servlet的生命周期;
5.如果想把页面做好看一些,怎么做?很明显Servlet是不行的,所以需要用到JSP(看上去就跟HTML页面差不多),Servlet主要是处理业务为主(Java后台代码),JSP主要以表现为主(HTML,CSS,JS等前端代码);
6.Servlet更擅长逻辑的编写,Jsp更擅长于数据的显示,以后我们开发会慢慢达到一个目标,servlet里面不要写HTML代码,jsp里面不要写java代码;
7.学习JSP,首先创建一个JSP出来?
注意:
1.如果没有导入jsp的jar包,页面会报错,但是不影响运行(tomcat – lib – jsp.ar);
2.不能直接拖到浏览器上面运行,它只能在服务器上面(JSP是服务器端页面)使用,服务器对它作了编译的。如下图直接运行时显示的是源码,并不是页面效果:
3.2.JSP原理分析
引入:Jsp页面上面的代码怎么运行之后,就变成右边的时间呢?
1.当我们访问hello.jsp –> 会去找到[conf目录]web.xml里面*.jsp,在会找到JspServlet,如下图:
2.生成后的jsp文件在apache-tomcat-7.0.57\work\Catalina文件夹下面,如下图:
3.在hello_jsp.java文件里面的_jspService方法里面出现的:
3.3.JSP中Java代码语法
3.3.1.JSP页面上面注释
JSP注释:<%–这是注释–%> 在jsp翻译成Servlet的时候这个注释就没有了,源代码看不到;
HTML注释:我们还可以用html的注释(),在页面上看源代码可以看到:
3.3.2.JSP中的JAVA代码
1.JSP表达式:
语法:<%=表达式%>(实际上就是调用输出流打印到页面上 out.print(表达式))
作用:输出数据到页面上;
例子:<%=new java.util.Date().toLocaleString() %>
转化成Java代码:转换到自动生成Servlet的_jspService方法中;
2.JSP小脚本:
语法:
<%
Java语句1;
Java语句2;
%>
作用:编写Java逻辑代码;
转化成Java代码:转换到自动生成Servlet的_jspService方法中;
3.JSP申明:
语法:
<%!
Java代码
%>
作用:定义成员;
转化成Java代码:转换成自动生成的Servlet类中的成员;
3.4.JSP三大指令
1.page:页面指令;
2.include:包含指令;
3.taglib:标签指令(JSTL); 引入标签库
3.4.1.page指令
格式:
<%@page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8” … >
属性:
language=“java”:语言只有java,意义不大
contentType=“text/html; charset=UTF-8”:输出的页面类型,相当于在Servlet里面写:
resp.setContentType(“text/html;charset=utf-8”)
errorPage="/myerror.jsp" :如果当前页面出错,就跳转到对应的页面
hello.jsp指定errorPage="/myerror.jsp"
isErrorPage=“true”:这个页面是否是错误页面(当我们要在页面上直接使用exception的时候就可以加上它)
3.4.2.include指令
1.当每个页面都有导航的时候,我们只需要使用一个,这个时候就可以使用包含指令:
注:一般被包含的jsp文件我们会取名为 jspf(jsp片断)
3.5.JSP九大内置对象
引入:在jsp页面里面,可以直接使用request和session,为什么可以直接使用?
原因:这里request和session 就是别人已经帮我们定义好的对象,这些对象叫内置对象。JSP中有9个内置对象中,这些对象我们直接拿到使用就是,不需要去创建,但是对象的名称不能写错;
原理:JSP内置对象的实质,要么是_jspService()方法的形参,要么是在_jspService()方法的局部变量,所以JSP脚本或者表达式中直接调用这些对象,无需创建它们;
注意:如果没有找到exception 需要在页面设置isErrorPage="true"才出来
3.6.四大作用域对象
引入:我们在做数据共享的时候,会把数据放到不同的地方。这个不同的地方就是放到不同的作用域里面,作用域对象有4个;
pageContext:每次访问的时候创建,可以有多个【每个jsp页面都会创建】;
request:每次请求的时候创建,可以有多个【每次请求都会创建】;
session:每次会话的时候创建,不同人打开不同的浏览器,就创建多个,可以有个多个;
application:整个应用有且只有一个对象,tomcat启动的创建,关闭的时候销毁;
我们需要学习 怎么把数据放到作用域里面?
怎么从作用域中拿到共享后的数据?
怎么从作用域中删除数据?
怎么修改作用域里面的数据? – 重新放一次
注意:
1.JSP四大作用域对象属于9大内置对象里面的,用来共享或传递数据的;
2.Servlet中同样有这四个作用域对象,不过不是内置的,使用之前必须先创建;
3.6.1.作用域对象的操作
3.6.1.1.作用域对象中添加修改数据
语法:作用域对象.setAttribute(key,value);
注意:如果是修改(就设置一个相同的key)
3.6.1.2.作用域对象中获取数据
3.6.1.3.删除作用域中的数据
语法:作用域对象.removeAttribute(“key”);
3.6.1.4.不能跨域获取值
1.作用域有大小,存在哪个作用域对象里,就需要在哪个作用域对象中去取得。即不能跨域获取值:
3.6.2.ServletContext对象的介绍
1.ServletContext 表示上下文对象的类型,也是JSP内置对象application的类型。那怎么去得到ServletContext对象呢?
3.6.2.1.得到ServletContext的方式
1.它们拿到的对象都是同一个对象,那我们选择哪种方式呢?
(1)第①中或第②种通过super获取;
(2)第③种更简单,不兼容低版本,不兼容tomcat7以前的版本;
(3)第④种麻烦一点,兼容性好;
3.6.2.2.ServletContext的常用方法
1.ServletContext对象已经拿到,那怎么使用它呢?主要看里面的一些方法:
getContextPath(); – 拿到上下文路径
getRealPath("/"); – 拿到真实路径(以后做上传下载可以使用)
getInitParameter(“encoding”); – 拿到初始化参数(只能拿到全局里面的参数信息)
3.与之前获取Servlet初始化参数对比:
(1)以前取到servlet里面配置的参数信息通过super.getServletConfig().getInitParameter(“encoding”)拿到
(2)现在web.xml配置全局的信息,通过app1.getInitParameter(“encoding”) 拿到:
注意:app1.getInitParameter(“encoding”); 只能拿到context-param里面配置,不能拿到Servlet里面配置的参数;
3.7.JSP动作元素
3.7.1.包含元素jsp:include
1.在JSP动作元素中,我们只了解 jsp:include这个动作元素:
注1:我们要用 jsp:include 来做包含页面的功能:
注2:使用jsp:include这个的时候,就不能再使用片段;
3.7.2.动态包含与静态包含的区别
1.动态包含指的是标签jsp:include,静态包含指的是指令include,它们包含的时机不同:
(1)静态包含先把页面包含进来,再翻译成java代码(只有一个文件);
(2)动态包含先都编译成java代码,再将内容进行包含(有多个文件);
2.什么时候用动态包含,什么时候用静态包含?
(1)如果包含的是静态页面(html),那么使用静态包含;
(2)如果包含的是动态网页(jsp),那么使用动态包含;
注:编译的文件(\apache-tomcat-7.0.57\work\Catalina\路径下面)
静态包含:<%@ include file="/include/b.jsp" %>
动态包含:<jsp:include page="/include2/b.jsp"></jsp:include>
4.课程总结
4.1.重点
1.转发forward和重定向redirect;
2.掌握四大作用域对象的创建,使用;
3.JSP的语法(Jsp中java代码的编写);
4.JSP三大指令,九大内置对象,四大作用域对象(面试题);
(1)JSP三大指令:page,include,tablib
(2)九大内置对象:request,response,out,pageContext,session,application,page,config,exception
(3)四大作用域对象:pageContext,request,session,application
4.2.难点
1.重定向和转发的区别;
(1)转发:一次请求,地址栏不会变化,request的数据可以共享,只能访问当前应用
(2)重定向:多次请求,地址栏会变化,request的数据不能共享,可以访问当前应用
2.九大内置对象,四大作用域对象不好记;
4.3.如何掌握
1.课上认真听课;
2.完成课后练习;
3.抓住课程重点;
4.JSP原理:查看 java文件解决;
4.4.排错技巧
1.通过异常和错误找出问题,分析问题,解决问题;
2.分析自己的逻辑是否出现问题;
5.常见问题
6.课后练习
1.课堂代码1-2遍;
2.完成一个网页计算器,图示: (预计30分钟完成)
思路:
(1)点击=按钮(提交按钮)将前面三个文本框的内容提交到Servlet;
(2)在Servlet中获取这三个参数,判断是什么操作(+,-,*,/);
(3)计算结果,然后绑定回页面(使用转发),显示在显示结果的文本框中;
7.面试题
1.JSP与Servlet区别? (预计5分钟完成)
(1)JSP底层就是一个Servlet;
(2)JSP注重数据的展示,Servlet注重业务逻辑的处理;
2.重定向redirect和转发forward区别是什么? (预计10分钟完成)
3.JSP九大内置对象有哪些? (预计5分钟完成)
4.动态包含和静态包含的区别? (预计10分钟完成)
5.page指令中errorPage与isErrorPage的区别? (预计5分钟完成)
8.扩展知识或者课外阅读推荐(可选)
8.1.扩展知识
8.2.课外阅读