一:servlet
1.servlet生命周期:可以被定义为servlet对象从创建到销毁的整个过程:
1)在创建servlet对象时,通过调用init()方法进行初始化
2)通过service()方法来处理客户端的请求,根据请求方式的不同转发给doGet()或doPost()方法
3)停止服务时,通过调用destory()方法销毁servlet对象
4)servlet对象被JVM垃圾回收器回收
2.servlet对象是单例的(一个类只能有一个对象)
每一次请求到达服务器时,服务器(tomcat)会检查有没有目标对象(servlet对象),如果没有则创建,如果有,则拿来直接使用。
由于servlet是单例的,所有的用户共享的是一个对象,所以在servlet实现类中不建议定义成员变量,在高并发情况下Servlet是线程不安全的。
3.servlet的几个方法
3.1 init()
1)初始化方法
2)只会调用一次;
3)在创建servlet对象时调用,在后续每次用户请求时不再调用。
@Override
public void init() throws ServletException {
System.out.println("******servlet init******");
}
3.2 service(),是执行实际业务的主要方法,由servlet容器调用service方法
1)作用:处理来自客户端的请求,并把格式化的响应写回给客户端
2) service()方法由容器tomcat调用;
3) service()方法会检查HTTP请求类型(GET/POST/PUT/DELETE等),然后根据请求类型的不同,调用对应的方法,如GET请求调用doGet()方法,POST请求调用doPost()方法;
所以,不需要对service方法做任何修改,只需要根据客户端的请求类型来重写doGet()和doPost()方法。
3.3 destory()
1)用来标记需要销毁的servlet对象
2)destroy()方法只调用一次,在servlet对象生命周期结束时(如停止tomcat服务–右键stop)被调用。
3) destroy()方法可以关闭数据库连接、停止后台线程、把cookie或者缓存写入硬盘以及其他清理活动
4)在调用destroy()方法后,servlet对象会被GC(垃圾回收)线程标记为被回收的资源(也就是说destroy后不会被立马销毁,需要等待GC)。
3.4 doGet和doPost方法:
1)创建一个普通类,继承javax.servlet.http.HttpServlet,重写doGet和doPost方法。
2)doGet方法:接受一个来自客户端的GET请求
3)doPost方法:接受一个来自客户端的POST请求。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接收一个来自客户端的GET请求,HttpServletRequest 接收客户端发送的请求报文
//HttpServletResponse 响应客户端的请求
}
4.请求与响应:HttpServletRequest ;HttpServletResponse
4.1 HttpServletRequest请求:
例如,在form表单里添加action;或者发送ajax请求
服务端jsp页面—在form表单action
标签里name属性—在servlet方法里通过getParameter()读取。
客户端方法
//设置请求编码
req.setCharacterEncoding("utf-8");
//获取请求参数(参数少的情况)
String name = req.getParameter("name");
//获取所有请求参数名的结果集(参数多的情况)
Enumeration<String> params = req.getParameterNames();
//遍历参数名结果集,获取所有参数值
//hasMoreElements判断参数名集合中是否有元素
while (params.hasMoreElements()) {
//nextElement获取下一个元素
String key = (String) params.nextElement();
System.out.print(key+":"+req.getParameter(key));
}
//向请求对象中添加参数
req.setAttribute("user_list", list);
4.2 HttpServletResponse响应服务端
public void reponseObject(Object obj, HttpServletResponse res) {
res.setCharacterEncoding("utf-8");//设置响应数据的编码
PrintWriter out = null;//创建字符输出流,向客户端响应数据
try {
out = res.getWriter();
out.write("yes");
out.flush();
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
success:function(str){//请求成功之后的回调函数,接收服务端响应的数据
alert("str");//yes
}
error:function(){//请求失败之后的回调函数
}
5.页面跳转方式:请求转发与重定向
5.1 请求转发 req.getRequestDispatcher("/WEB-INF/page/show.jsp").forward(req, res);
5.2 重定向
res.sendRedirect("http://baidu.com");
或
res.sendRedirect("user?method=queryAll");
5.3 请求转发与重定向的区别
//完整servlet类展示
package servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DemoServletOne extends HttpServlet{
{
System.out.println("yes");
}
@Override
public void init() throws ServletException {
System.out.println("*****init*****");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("*****service*****");
super.service(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("接受HTTP的GET方式请求");
//请求转发:通过请求转跳转到JSP页面
req.getRequestDispatcher("/WEB-INF/page/demo1.jsp").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
@Override
public void destroy() {
System.out.println("*****destroy*****");
}
}
二:JSP几个内置对象
1.session会话
1)一次会话:从用户通过浏览器访问Web项目开始,到用户关闭浏览器结束,认为是一次会话。
2)session会话对象作业:session中的信息保存在服务器内存中,用来缓存一些临时信息。
3)session对象是单例的。不是线程安全的。
4)session是tomcat内置参数。
5)session读取、添加参数 – session.getAttribute()和session.setAttribute()
6)session失效时间 – session.setMaxInactiveInterval();来设置session失效时间。以秒为单位。
1.在DemoServletOne.java服务端:-- 创建session会话
HttpSession session = req.getSession();
session.setAttribute("s_name", "李四"); //向session中添加信息
session.setAttribute("s_age", 12);
session.setMaxInactiveInterval(5);//设置session失效时间为5s
2.在请求的jsp页面
<%=session.getAttribute("s_name") %>
<br>
<%=session.getAttribute("s_age") %>
3.在AjaxServlet.java服务端也可访问session会话对象。访问到的是同一个session对象。但如果设置了session失效时间,超过时间后, session对象将失效。
HttpSession session = req.getSession();
String sName = (String)session.getAttribute("s_name");//获取session的s_name属性值
Integer sAge = (Integer)session.getAttribute("s_age");
System.out.println("s_name="+sName+";s_age="+sAge);
2.out输出对象
用于把数据输出到网页上。
1.<% String a = new String("Hello!!")%>
<%=a %>
效果等同于
2.<% out.println(a);%>
上面的<%=session.getAttribute("s_age") %> 等同于<% out.println(session.getAttribute("s_age")); %>
3.ajax请求
是客户端发送ajax请求给服务端。发送ajax请求给servlet类,不会刷新数据。用form表单的action发送请求,会刷新数据。
// 流程:通过DemoServletOne访问demo1.jsp页面;在页面中通过点击按钮,发送ajax请求给服务端AjaxServlet.java。
<head>
//引入jquery包
<script src="${pageContext.request.contextPath}/js/jquery-1.9.1.min.js"></script>
<script>
function find(){
$.ajax({
url:"AjaxServlet",//请求地址
type:"POST",//请求方式POST或GET
//data:{"addr":"山东青岛","userNo":"1001","phone":"123456789"},//请求参数写法1
data:"addr=山东青岛&userNo=1001&phone=123456789",//请求参数写法2
success:function(str){//请求成功之后的回调函数,接收服务端传回的数据.
alert(str);//服务端输出流写入缓存,客户端从缓存读取。
},
error:function(){//请求失败之后的回调函数
}
});
}
</script>
</head>
<body>
<input type="button" value="提交请求" onclick="find();"/>
</body>
//AjaxServlet端
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取所有请求参数名的结果集
Enumeration<String> params = req.getParameterNames();
//遍历参数名结果集,获取所有参数值
//hasMoreElements判断参数名集合中是否有元素
while(params.hasMoreElements()) {
//nextElement获取下一个元素
String key = (String)params.nextElement();
System.out.println(key+":"+req.getParameter(key));
}
//创建字符输出流,输出success到缓存(也就是AjaxServlet.java中回调成功的参数str)
PrintWriter out = null;
out = resp.getWriter();
out.write("success");
out.flush();
if(out == null) {
out.close();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
三 JSTL标准库函数:JSTL标签库是一个JSP标签的集合,封装了许多jsp应用程序通用的核心功能
1.引入JSTL标签库
<!-- uri:标签库路径
prefix:标签库别名
-->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
2.JSTL格式化标签 <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="f"%>
3.JSTL常用标签
1)forEach
//servlet类中:
List<Staff> list = DBHelper.queryAll(sql.toString(), Staff.class,null);
req.setAttribute("list", list);//给req设置参数list
req.getRequestDispatcher("/WEB-INF/page/staff_list.jsp").forward(req, res);//staff_list页面接受到list数据。
//staff_list页面
//items 被遍历的数据集;var 每一条遍历记录的别名;类似于java的for(var : items){}
<c:forEach items="${list}" var="str">
<p>${str}</p>
</c:forEach>
2)if
<c:if test="${no>20 }">
<p>yes</p>
</c:if>
3)choose
<!-- 类似于java中的switch -->
<c:choose>
<c:when test="${no > 20}">
<p>大于20</p>
</c:when>
<c:when test="${no < 20}">
<p style="color:red;">小于等于20</p>
</c:when>
<c:otherwise><!-- 其他情况 -->
<p>otherwise</p>
</c:otherwise>
</c:choose>
4)out输出标签
<c:out value="输出标签,类似out内置对象" />
5)set 声明变量标签
var:变量名;value:变量值;scope声明变量作用域:page、request、session、application
page:只能应用于当前页
request:只能应用于当前的请求
session:在本次session内有效
application:能应用于整个应用程序内
<c:set var="money" value="200" scope="session" />
四、EL表达式
作用:
1 获取服务端请求中的参数值
2 输出数据到jsp页面
3 获取请求中的参数对象的属性值
${map.name};
${map.age};
${ list[0] };
五 Filter 过滤器
1.定义:
1)过滤器可以动态的拦截请求和响应,以修改或是用包含在请求中的信息。
2)Filter过滤器可以实现的功能:
在客户端的请求访问之前,拦截这些请求,对用户请求进行预处理。
对HttpServletResponse进行后处理。
3)如果有多个Filter,执行顺序与 在web.xml配置文件中的配置顺序一致,一般把filter配置在所有的 servlet之前。
2.Filter的几个方法。
1)首先,实现Filter接口
public class FirstFilter implements Filter{
}
2)init()方法
init方法初始化filter对象,在程序启动时调用init方法。
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//filterConfig读取配置文件(web.xml)的中的初始化属性
//在web.xml中配置初始化参数Site
String site = filterConfig.getInitParameter("Site");
System.out.println("*****filter init "+site+"*****");
Filter.super.init(filterConfig);
}
3)doFilter方法
拦截请求。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("*****filter do*****");
String method = request.getParameter("method");
if (method == null || method == "") {
response.setCharacterEncoding("gb2312");
PrintWriter out = response.getWriter();
out.write("未指定method参数");
out.flush();
out.close();
return;
} else {
//放行请求
chain.doFilter(request, response);
}
}
}
3.web.xml配置Filter
<!-- 过滤器 -->
<filter>
<!-- 指定filter类的别名-->
<filter-name>first</filter-name>
<!-- 指定filter类的完整包路径 -->
<filter-class>filter.FirstFilter</filter-class>
<!-- 初始化参数,在init方法中用到 -->
<init-param>
<param-name>Site</param-name>
<param-value>hello world!</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>first</filter-name>
<!-- 指定filter的拦截路径 -->
<url-pattern>/comp</url-pattern>
</filter-mapping>
六、Listener监听器
1.定义
1)Javaweb中的监听器是用于监听web常见对象。
例如:HttpServletRequest、HttpSession、ServletContext
2)作用:监听web对象的创建与销毁、监听web对象属性的变化、监听session绑定javabean的操作。
2.Listener的几个方法
1)首先,实现ServletRequestListener接口
public class MyListener implements ServletRequestListener{//ServletRequestListener请求监听器
}
2)监听请求销毁
@Override
public void requestDestroyed(ServletRequestEvent sre) {
// ServletRequestListener.super.requestDestroyed(sre);
System.out.println("***request has destroy***");
}
3)监听请求创建
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("***request has init***");
// ServletRequestListener.super.requestInitialized(sre);
}
3.web.xml配置listener
<!-- 监听器 -->
<listener>
<listener-class>listener.MyListener</listener-class> <!-- MyListener类 -->
</listener>
七、servlet、filter、listener
1.servlet、filter、listener各方法的执行顺序
2.Filter过滤器和listener监听器的区别
1)Filter是对某一资源的请求,或修改某一资源的响应。
2)servlet是产生一个请求或者响应。
3)listener可以监听web服务器中某一个执行动作,并根据其要求作出相应的响应。
3.WEN / INF目录:
WEB / INF是java的web应用的安全目录,客户端无法访问(例如jsp页面或者网页url路径),只能通过服务端(servlet)访问。在WEB / INF中主要是系统运行的配置信息和环境。