一:Servlet部分
1. Web程序的开发就是写servlet,所有的都是Servlet,jsp也是一种特殊的Servlet。
2. 所有的servlet必须实现servlet接口,但通常是去实现HttpServlet,
层次结构是servletßGenericServletßHttpServlet,HttpServlet中有service()方法,和各种doGet(),doPost()等doXXX()方法来接受请求并返回响应,service()方法和各种doXXX()的参数都是HttpRequest和HttpResponse.
3. Servlet容器或服务器接受请求后会将请求封装成HttpServletRequest对象,并将这个HttpServletRequest对象和一个HttpServletReponse对象传给所请求的servlet的service(),这个Service()在根据请求方式去调用响应的doXXX()方法。所有的请求信息都封装在了HttpServletRequest对象中,有响应的方法都能拿到。所有的响应信息都被封装在HttpServletResponse对象中。
4. 根据Servlet规范,java Web应用程序有特定的目录结构
5. 写完Servlet类后,还不能用,必须在web.xml中配置servlet,配两个东西,一个
<servlet>
<description>description>
<display-name>MyServlet2display-name>
<servlet-name>MyServlet2servlet-name>
<servlet-class>com.zhengjie.servlets.MyServlet2servlet-class>
servlet>
<servlet-mapping>
<servlet-name>MyServlet2servlet-name>
<url-pattern>/MyServlet2url-pattern>
servlet-mapping>
访问URL就是:http://localhost:8080/ProjectName/MyServlet2
6. Servlet配置中还可以配置一些初始化参数,在servlet中用getInitParameter(String param)来获取初始化参数:
<servlet>
<description>description>
<display-name>MyServlet2display-name>
<servlet-name>MyServlet2servlet-name>
<servlet-class>com.zhengjie.servlets.MyServlet2servlet-class>
servlet>
7. 上面讲到的初始化参数只能某个servlet获取,还有一种是上下文参数,所有servlet都能获取,配置如下:
<context-param>
<param-name>contextConfigLocationparam-name>
<param-value>
classpath*:spring/applicationContext*.xml
param-value>
context-param>
这种初始化参数每个servlet都能获取到,servlet的getServletConfig()获取ServletConfig对象,在调servletConfig对象的getServletContext()获取servletContext对象,然后再调servletContext对象的getInitParameter(String param)获取上下文初始化参数。
8. 初始化参数和上下文参数只能配置简单的字符串类型参数,配置其他类型的参数应该配在XML文件或properties文件中,在程序中读取。
9. Servlet的生命周期
(1) servlet的生命周期是有容器或服务器维护的
(2) servlet在服务器启动或客户端第一次请求该servlet是初始化一个对象(servlet的配置决定load-on-startup为0或1),会调用servlet的init()方法,并用该对象处理所有的请求(以多线程的方式)。
(3) servlet在容器或服务器停止时结束生命周期,会调用servlet的destory()方法。
10. servlet的跳转:
(1) 转向(forward),MVC框架常用的一种方式,对客户端是透明,客户端不知道服务器端的跳转
RequestDispatcher rd = request.getRequestDispatcher("/XXXservlet");
rd.forward(request, response);
(2) 重定向(redirect),相当于客户端重新请求了新的地址
response.sendRedirect("/xxxServlet");
11. servlet不是线程安全的,多个线程访问同一个servlet时会有问题,解决办法是:不在servlet类中定义属性,而是直接在doxxx()方法中定义属性。
二:jsp部分
1. jsp也是servlet,是另一种更像html的servlet。容器或服务器在编译时会将jsp编译成servlet。
2. servlet是先编译成class文件再部署到服务器上,JSP页面是先直接把把JSP页面部署到服务器上,在客服端第一次请求该JSP时,服务器才把它转换成servlet并编译成class文件,因此第一次访问JSP会比较慢。
3. jsp中java部分用<%%>括起来,<%= %>用于输出,类似于servlet中的out.print()方法,在<%! %>之间定义方法。
4. jsp指令,<%@ %>包起来。主要有3中jsp指令:page,include,tablib。
5. <%@ include file=”URL”%>和
(1)<%@ include file=”URL”%>是先把被包含的文件包含进来,然后编译成一个Class文件,属于先包含后编译。
(2)
6. el表达式取值必需是servlet四大作用(servletContext>session>request>pageContext)中有的值, 这四个域都有setAttribute("",object)方法和getAttribute("")方法 el表达式 会自动从四大域中按作用范围从小到达寻找搜寻对应名字的值,其内部调用的就是pageContext的findAttribute("")方法;如果要想在页面通过el表达式得到值就必需先调用域的setAttribute方法把值设置进去,不需要什么配置,直接写el表达式就可以如下代码
<%
application.setAttribute("name","zhangsan");//Context域
session.setAttribute("name","lisi");//session域
request.setAttribute("name","wangwu"); //request域
pageContext.setAttribute("name","zhaoliu");//page域
%>
${name}
输出结果是page域中的zhaoliu 如果将page域删掉则输出wangwu 依次类推
6. EL表达式,取值的默认顺序是:servletContext>session>request>pageContext,这是在没有作用域前缀的情况下,EL表达式可指定作用域前缀如:${requestScope.person.age},所有作用域如下图:
7. El表达式还支持简单计算如:${1+1},${1<2}
8. Jsp页面中包含了很多隐藏的对象:out,request,response,config,session,application,page,pageContext,exception等,可以直接使用。
三:会话跟踪
1. 因为http协议时无状态的协议,一旦交互完毕就断开连接,所以无法记录会话,所以出现两种技术来记录会话,Cookie和session。
2. Cookie实际就是客户端浏览器保存的一段文字,用来表明身份,每次请求服务器是,服务器就可以根据cookie内容来判断客户端身份。
3. Java把Cookie封装成javax.servlet.http.Cookie类,cookie是以键值对的形式存在,没个cookie只有一个键值对。
4. 服务器可以通过request.getCookies()来获取客服端Cookie,可以通过response.addCookie(Cookie cookie)来向客户端写Cookie。
5. Java中有两个字符编码的类:
(1) 编码用java.net.URLEncoder类的encode(String str,String encoding)方法,如:
String name = URLEncoder.encode(“姓名”,“UTF-8”);
(2) 解码用java.net.URLDecoder类的decode(String str,String encoding)方法,如:
String name = URLDecoder.decode(“姓名”,“UTF-8”);
6. cookie可以设置有效时间,cookie.setMaxAge(100000),单位为秒。
7. cookie不支持删除和修改,只能写一个重名的cookie覆盖掉原来的cookie,想删除就把MaxAge设置成0。
8. cookie保存在客户端,所以JavaScript有优先权操作cookie,document.cookie可以获取cookie。
9. 除了cookie还有一种会话跟踪技术是session,session保存在服务器端,有一定的存储压力,cookie保存在客户端。
10. Session被java封装成java.servlet.http.HttpSession类,每个客户端在服务器端都对应一个session, Request.getSession()来获取session,request.getSession(true)在没有Session时会创建Session,Session也是键值对的形式,session.setAttribute(Stringstr,Object obj)设置Session,session.getAttribute(String str)来获取Session值。
11. JSP页面中,可以直接用隐藏对象Session来操作Session。
12. Session在客户端第一次访问服务器是自动创建,为了存储效率Seesion一般存在内存中,所有不能存储大的数据,防止内存溢出。
13. 随着访问客户增多,Session会越来越多,所以session有一个有效时间,到时间后服务器会自动将本Session删除。Session.setMaxInactiveInterval(long l)设置有效时间,单位秒。
14. Session需要cookie的支持,虽然session的数据存在服务器端,客户端需要保存一个标示来表明客户身份,客户端只会传一个JSSEIONID来表明身份。
15. 在浏览器禁用Cookie后,session和cookie都不能用了,还有另一种会话跟踪技术是URL重写,就是在服务器响应式将session的Id返回到客户端,详见JAVA+web整合开发王者归来书籍。
16. Session和Cookie区别:
(1) cookie存在客户端,session存在服务器端
(2) cookie只能存少量的文字信息,session可以存各种类型数据,包括java对象。
(3) 每个客户端都会有一个session,而且session是存在服务器端,所以用session时服务器负担较大。
四:过滤器Filter
1. 过滤器(filter)和监听器(listener)是servlet规范里的两个高级特性。
2. 过滤器的处理过程如图:
3. filter提出了滤镜链(FilterChain)的概念,每个滤镜链包含多个过滤器(Filter)。
4. 所以的Filter必须实现javax.servlet.Filter接口,filter接口有3个方法,init(FilterConfig config),destroy(),doFilter(ServletRequestrequest,ServletResponse response,FilterChain chain)。
5. doFilter(ServletRequestrequest,ServletResponse response,FilterChain chain)方法中要只执行chain.doFilter(request,response),这样request才会流转到chain中的下一个Filter,最后流转到servlet。
6. 过滤器(Filter),也是需要在web.xml中配置的:
<filter>
<filter-name>myFilterfilter-name>
<filter-class>com.filter.MyFilterfilter-class>
<init-param>
<param-name>nameparam-name>
<param-value>zhengjieparam-value>
init-param>
filter>
<filter-mapping>
<filter-name>myFilterfilter-name>
<url-pattern>/jsp/*url-pattern>
<url-pattern>*.dourl-pattern>
<dispatcher>REQUESTdispatcher>
<dispatcher>FORWARDdispatcher>
filter-mapping>
7. filter的执行顺序是按照web.xml配置的顺序执行的。
8. 常用用途:字符编码的过滤器
五:监听器(listener)
1. 监听器主要实现对request,session,context的监听。
2. 使用监听要实现响应的接口,使用不同的监听,就实现不同的监听接口,只管实现接口的方法就行了,响应时间发生时,服务器会自动掉相应的监听方法。
六:JSTL标签库
1.JSTL:java stand taglibrary,java标准标签库。
1.JSP中EL表达式是一个很有用的工具。但EL表达式功能有限,加上JSTL和EL配合使用就基本可实现所有功能了。