1、监听器
(1)什么是监听器?
servlet规范当中定义的一种特殊的组件,用来监听servlet容器产生的事件并进行处理。
事件主要有两大类:
a 生命周期相关的事件:容器创建或者销毁request,session,ServletContext三个对象时产生的事件。
b 绑定相关的时间:调用了request,session,ServletContext的setAttribute产生的事件。
(2)如何去写一个监听器?
第一步:先写一个java类,实现相应的监听接口。要一句监听的事件类型来选择相应的监听器接口(比如,要监听Session的创建和销毁,要用httpSessionListener接口)。
第二步:在接口所声明的方法里面,实现相应的处理逻辑。
第三步:注册监听器(web.xml).
在线人数
2. ServletContext接口
(1)容器在启动的时候,会为每一个应用创建唯一的一个符合ServletContext藉口的实例,称之为Servlet上下文。servlet上下文会一直存在,除非容器关闭或者应用被卸载。
(2)如何获得ServletContext?
a GenericServlet.getServletContext();
b HttpSession.getServletContext();
c ServletConfig.getServletContext();
d FilterConfig.getServletContext();
(3)作用
a 依赖逻辑落井获得实际部署时的物理路径
StringgetRealPath(String path);
b 绑定数据
setAttribute,getAttribute,removeAttribute
request,session,servet上下文都有这三个方法,在满足需要的情况下应该优先使用声明周期短的。声明周期长短排序request<session<servlet
c 访问全局的初始化参数
//全局初始化参数web.xml
<context-param>
<param-name>abc</param-name>
<param-value>def</param-value>
</context-param>
用servlet上下文访问
StringgetInitParameter("abc");
3、servlet线程安全问题
(1)servlet为什么会有线程安全问题?
默认情况下,servlet在容器内部只有一个实例;
如果有多个请求同时访问某个servlet,容器会启动多个线程来调用这个servlet实例,就有可能发生线程安全问题:比如,多个线程同时去修改servlet实例的某个属性。
(2)如何解决?
a,使用synchronized关键字加锁
b,让servlet实现SingleThreadModel接口(不建议使用)容器会为每一个线程创建一个对应的servlet实例来处理请求。因为会产生过多的servlet实例,所以,建议少用。
servlet小结
1、servlet基础
(1)什么是servlet?
(2)什么是servlet容器?
(3)servlet依不依赖某个特定的servlet容器?
(4)如何开发一个servlet?
(5)http协议(了解)
http协议是什么?
http协议的特点?
状态码是什么?
消息头是什么?常见的消息头有哪一些?
请求数据包与响应数据包的格式?
(6)get请求与post请求
哪一些是get请求,哪一些是post请求,各自的特点。
2、servlet核心
(1)表单的处理
a,获得请求参数值:
Stringrequest.getParameter(String paraname);
String[]request.getParameterValues(String paraname);
b,中文参数值:
step1,要保证表单所在的页面按照指定的编码格式打开。
html: <meta http-equiv="content-type"
content="text/html;charset=utf-8">
jsp: <%@page pageEncoding="utf-8"
contentType="text/html;charset=utf-8"%>
step2,
方式一: request.setCharacterEncoding("utf-8");
方式二: newString(str.getBytes("iso-8859-1"),
"utf-8");
(2)容器如何处理请求资源路径?
(3)如何让一个servlet处理多种请求?
(4)转发与重定向
a,什么是重定向?
b,如何重定向 ?
response.sendRedirect(Stringurl);
c,重定向的特点?
d,编程需要注意的问题
e,什么是转发?
f,如何转发?
request.setAttribute(Stringname,Object obj);
RequestDispatcherrd =
request.getRequestDispatcher(Stringurl);
rd.forward(request,response);
Objectrequest.getAttribute(String name);
g, 转发的特点
h,转发与重定向的区别
(5)servlet的生命周期
a,分成哪几个阶段
b,servlet在什么时候实例化?
c,load-on-startup参数
d, 如何override init方法?
e,初始化参数如何配置?
f,生命周期相关的几个接口与类?
Servlet接口,GenericServlet抽象类,
HttpServlet抽象类,ServletConfig接口,
ServletRequest/ServletResponse接口
3、状态管理
(1)什么是状态管理?
(2)cookie
a,什么是cookie?
b,如何创建cookie?
Cookiec = new Cookie(String name,String value);
response.addCookie(c);
c,查询
Cookie[]request.getCookies();
Stringcookie.getName();
Stringcookie.getValue();
d,编码问题
StringURLEncoder.encode(String str,String code);
StringURLDecoder.decode(String str,String code);
e,生存时间
cookie.setMaxAge(int seconds);
f,路径问题
cookie.setPath(Stringpath);
g,cookie的限制
(3)session
a,什么是session?
b,如何获得一个session?
HttpSessions = request.getSession();
HttpSessions = request.getSession(boolean flag);
c,常用方法
setAttribute,getAttribute,removeAttribute
StringgetId()
d,超时
session.setMaxInactiveInterval(intseconds);
e,删除
session.invalide();
f,session的优点与缺点
g,如果用户禁止cookie,如何继续使用session?
url重写(response.encodeURL,response.encodeRedirectURL)
4、数据库访问
(1)使用jdbc访问数据库
(2)dao
5、过滤器和监听器
(1)什么是过滤器
(2)如何写一个过滤器?
(3)过滤器的初始化参数
(4)过滤器的优先级
(5)过滤器的优点
(6)什么是监听器
(7)如何写一个监听器
(8)ServletContext接口
6、典型案例和扩展
员工管理
session验证
验证码
一、jsp基础
1、什么是jsp?
2、怎样写一个jsp?
step1,写一个以.jsp为后缀的文件
step2,添加如下的内容:
(1)html (css,js) : 直接写
(2)java代码:
1)java代码片断: <% java代码 %>
2)jsp表达式 <%= java表达式%>
3)jsp声明 <%! %>
(3)jsp指令
1)什么是jsp指令? 通知容器,当容器将.jsp文件转换成.java文件时,做一些处理,比如导包。
2)page指令
import属性
pageEncoding属性
contentType属性
session属性:true(缺省值)/false,当值为false时,容器不再添加获得session的语句,也就是说,不能够直接使用session隐含对象了。
isELIgnored属性:true(缺省值)/false,当值为false,容器不会忽略el表达式。
errorPage属性:值是一个jsp,用这个jsp来处理当前页面运行时产生的异常。
isErrorPage属性:true/false(缺省值),当值为true,表示这是一个错误处理页面。
3)include
file属性
4)taglib
用来导入标签
(4)隐含对象
out
request
response
session
application:ServletContext
exception:只有当isErrorPage属性值为true时,才能使用,可以通过该隐含对象获得错误信息(getMessage())。
config:ServletConfig实例。
pageContext:页面上下文,容器会为每一个
jsp实例创建唯一的一个符合PageContext接口要求的实例,称之为页面上下文。页面上下文会一直存在,除非容器销毁jsp实例。
作用1:绑订数据setAttribute,getAttribute,removeAttribute注意:绑订的数据,只有对应的jsp实例才能访问。
作用2:找到其它八个隐含对象。
page:表示jsp实例。
(5)注释
1) <!-- 注释的内容 --> : 允许注释的内容是java代码,如果是java代码,会执行,但是,执行的结果,浏览器并不会输出。
2)<%--注释的内容--%> :不允许注释的内容是java代码,如果有java代码,会被忽略。浏览器不会输出注释的内容。
(6)活动元素
jsp已经运行了,通知容器做一些处理。
a,<jsp:forwardpage=""/> : 转发 ,其中,page 属性指定转发的目的地。
b,<jsp:includepage=""/> : 包含某个页面的运行结果。
page属性指定被包含的页面的地址。
include指令是将某个文件的内容插入到指令所在的位置,容器并不会调用被插入的文件。
c,<jsp:param name="" value="">: 添加参数,name属性指定参数名,value属性指定参数值。
d,<jsp:useBeanid="user" class="bean.User" scope="request"/>
容器会先从request对象中查找绑订名称为"user"的对象(request.getAttribute),如果找不到,则创建该对象,然后绑订(request.setAttribute);如果找到了,则什么也不做。
scope属性可以是page,request,session,application
e,<jsp:setPropertyname="user" property="name" value="tom"/>
先找到绑订名为user的对象,然后给name属性赋值为tom。
f,<jsp:getPropertyname="user" property="name"/>
先找到绑订名为user的对象,然后输出name属性值。
g,<jsp:setPropertyname="user" property="*"/>
依据请求参数名称将请求参数值赋给对应的属性。
3、jsp是如何运行的?
step1,jsp转换成对应的servlet类
a,html ------> service方法里,使用out.write输出
b, <% %> ------> service方法里,照搬。
c,<%= %> ------->service方法里,使用out.print输出。
d,<%! %> ------->在对应的servlet类里面,添加新的属性或者新的方法。
step2,调用servlet。
1. jsp标签和el表达式
1)jsp标签是什么?
因为直接在jsp文件里面写java代码,不方便代码的维护(比如,美工就不方便直接修改jsp),所以,sun制定了jsp标签技术规范,即使用类似与html标签的jsp标签来代替java代码,这样jsp文件里面就不再有java代码了,jsp会变得 更简洁,也更利于维护。
2)jstl(javastandard taglib java标准标签库) jstl.jar standard.jar
是一套简单的计算规则,用于给jsp标签的属性赋值,也可以直接使用(即也可以脱离jsp标签,单独使用)。
3)el表达式的用法
1)访问bean的属性:
方式一:
${user.name}:一次从pageContext,request,session,application中查找绑定名称为"user"的对象,然后调用getName方法并输出相应的值。
注意:a 依次指的是:先从pageContext中查找,如果找不到,再查找request,以此类推,
b 如果找到则不再向下查找。如果找不到,会输出空字符串“”。
c 属性名不能写错,否则会出错
d 如果要制定查找范围,可以使用pageScope,rquestScope,sessionScope,applicationScope来制定,比如:${sessionScope.user.name}
方式二:
${user["name"]},允许[]里面变量(即绑定名称),此外,还允许[]里面出现从0开始的下标,用来访问数组的某个元素。
2)获取请求参数值
${param.age}
等价于request.getParameter("age");
${paramValues.city}
request.getParameterValues("city");
3)进行一些简单的计算,并且将计算结果直接输出,或者也可以给jsp标签的属性赋值。
a 算术运算:"+" "-" "*""/" "%"需要注意,“+”只能进行值的相加,不能够连接字符串
b 逻辑运算:"&&" "||""!"
c 关系运算: ">" "< ""==" "!=" ">=" "<="
d empty字符串:判断集合是否为空,或者是否是一个空字符串。
一下四种情况,结果为true:
字符串
空的集合
null
值不存在
4)jstl
a jstl:java standard taglib
b 编程步骤
1:将jstl相关的.jar文件拷贝到web-inf\lib下。
2:使用taglib指令引入标签
<%@tagliburi="" prefix=""%>
uri属性:指定命名空间,参考对应的.tld文件。
prefix属性:命名空间的前缀。
3:核心标签
a:if标签
<c:if test=""var="" scope="">
标签体:可以是html,<% %>,<%= %>,<%! %>
</c:if>
test属性:当值为true,执行标签体的内容,为false则不执行。test属性可以使用el表达式来赋值。
var属性:指定一个绑定名。
scope属性:指定一个绑定范围,可以是"page" "request""session" "application".
b:choose标签
<c:choose>
<c:when>
</c:when>
....
<c:otherwise>
</c:otherwise>
</c:choose>
when标签可以出现一次或者多次,otherwise只能出现一次或者0次,表示例外。
c:forEach标签 用来对集合进行遍历
<c:forEachitmes="" var="" varStatus="">
</c:forEach>
items属性用来指定要遍历的集合,一般使用el表达式来赋值。
var属性:用来指定一个绑定名,绑定范围是pageContext。
forEach标签每次从指定的集合中取一个对象,然后绑定到pageContext对象上,绑定名由var属性来指定。
varStatus属性:指定一个绑定名称,绑定范围是pageContext,绑定值是容器创建的一个对象,该对象提供了获取当前遍历状态的信息的方法。比如,提供了getIndex方法(当前遍历的对象的下标,从0开始),getCount方法(返回当前是第几次访问,下标从1开始)
4:jsp标签是如何运行的?
容器根据标签的命名空间找到相应的标签的描述文件(.tld文件),接下来,依据标签的描述文件找到标签类,然后实例化,最后调用标签对象的相应的方法。
练习:
将员工管理应用中的两个页面(emplist.jsp,updateEmp.jsp)中的java代码使用jstl中的标签与el表达式来代替。
(5)自定义标签(简单标签技术)
step1,写一个java类,继承SimpleTagSupport类。
step2,override doTag方法,在该方法里面,编写相应的处理逻辑。
step3,在.tld文件当中,描述标签。可以参考 c.tld文件,并且,描述文件要放到WEB-INF下。
<body-content>empty</body-content>: 该标签没有标签体。
<body-content>scriptless</body-content>:该标签可以有标签体,但是,标签体不能够出现java代码(<% %> <%= %> <%! %>)。
<body-content>JSP</body-content>:该标签可以有标签体,并且,标签体的内容也可以是java代码。只有复杂标签技术才支持"JSP"。简单标签技术只支持"empty"和"scriptless"。
练习: 写一个DateTag标签,用来输出当前的系统日期:
<c1:datepattern="yyyy-MM-dd"/>,其中,pattern
用来指定日期输出的格式。