Servlet、JSP、Filter、Listener

9 篇文章 0 订阅

一: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中主要是系统运行的配置信息和环境。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值