JAVAEE 第一课 ----- ch2 ----- servlet&filter

servlet

servlet是一个处于client端即浏览器与后端DB之间的一个小程序,用于接收客户端发来的请求,对该请求做出处理,再发往后端;再将后端产生的响应传回给client端

servlet的生命周期

package ch1;

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 servletDemo extends HttpServlet{
	//以下为一个servlet的生命周期
	@Override
	public void init() throws ServletException {
		System.out.println("-------------创建servlet-------------");
	}
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("-------------运行servlet-------------");
	}
	@Override
	public void destroy() {
		System.out.println("-------------销毁servlet-------------");
	}
}

 

  1. init()在收到请求时被调用
  2. service()在处理请求时被调用
  3. destroy()在servlet引擎终止时被调用(如关闭服务器,ps:在tomcat安装目录的bin目录下运行shutdown.bat进行关闭)

servlet的配置

定义好servlet类之后,还需要对其进行配置,才能使得servlet容器发现并找到servlet类,从而使其发挥作用,通常使用web.xml文件配置servlet类

<web-app> 
<!-- servlet配置 -->
    <servlet>
    	<!-- servlet-name用于建立起servlet与html/jsp等前端页面的联系 -->
    	<!-- 而servlet-name本质上就是对应的servlet的别名 -->
  		<servlet-name>servletDemo</servlet-name>
  		<!-- 完整的包名+类名 -->
  		<servlet-class>ch1.servletDemo</servlet-class>
  </servlet>
  <servlet-mapping>
  		<servlet-name>servletDemo</servlet-name>
  		<url-pattern>/search</url-pattern>
 </servlet-mapping>
</web-app> 

Filter--过滤器及其配置

主要对到达servlet之前与离开servlet之前的数据内容做筛查,对不符合规则的数据做出相应的处理

要是有filte必须在web.xml中做配置以及定义一个实现具体规则的filter类

以下这个filter主要是对HTML表单提交数据的中文乱码做出处理

<web-app>
<!-- Filter配置 -->
<filter>
		<!-- 为该filter类取别名 -->
  		<filter-name>filterDemo</filter-name>
  		<filter-class>ch1.filterDemo</filter-class>
  		<!-- 设置初始化参数 -->
  		<init-param>
  		<!-- 在filter内部设置的初始化参数只能在该filter内部使用,即只有这个filter有这个初始化属性值 -->
  				<!-- 参数名 -->
  				<param-name>encoding</param-name>
  				<!-- 参数值 -->
  				<param-value>utf-8</param-value>
  		</init-param>
  </filter>
  <filter-mapping>
  		<!-- 对应上面的filter别名 -->
  		<filter-name>filterDemo</filter-name>
  		<!-- 使用通配符*,设置所有的request请求都将被该过滤器拦截进行处理 -->
  		<url-pattern>/*</url-pattern>
  </filter-mapping>
  <!-- 对比servlet和filter可见二者的结构相似,只是filter有初始化参数 -->
</web-app>
package ch1;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;

import jdk.nashorn.internal.runtime.regexp.joni.Config;
//所有用户自己定义的filter过滤器都是继承父类Filter,其父类是一个接口,
//因此其所有子类都必须实现其抽象方法doFilter()
//doFilter()是过滤器的核心方法,因为过滤的规则定义在该方法内
public class filterDemo implements Filter{
	//定义一个全局遍历encoding,用于init()与doFilter()之间传值
	String encoding;
	@Override	//init()方法通过调用FilterConfig对象的getInitParameter()来获取web.xml文件中定义的初始化参数
	//初始化参数之所以定义在web.xml中是因为web.xml是相对于整个项目而言的
	//即其中的数据可以整个项目各个文件共享
	//因此将初始化属性定义在web.xml文件中而不是在每一个过滤器中
	//是为了便于后期对于属性值的修改
	//当属性值需要变更时,只需要在web.xml文件中做出改变,而不需要在每一个过滤器中做修改
	public void init(FilterConfig filterConfig) throws ServletException {
		//通过使用 getInitParameter("初始化参数名称") 来获取对应的参数
		//因此encoding = utf-8
		encoding = filterConfig.getInitParameter("encoding");
	}
	@Override	//该方法用于定义过滤规则,共3个参数
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		//通过request对象的setCharacterEncoding("编码名称")来设置从request获取到的数据的编码方式
		//需要编码是为了在各个不同os之间传递数据,因为每个os可能支持的是不同的语言
		//通过统一的编码格式发送数据,接收方再通过自己的编码方式进行译码
		//则实现了不同os上不同语言之间的通信
		//但是编码格式要与解码格式相同才能正确获得数据
		//汉字编码为utf-8,所以接受方必须也使用utf-8对接收到的数据进行解码才能获得正确的数据
		//否则看到的就是一堆乱码
		request.setCharacterEncoding(encoding);
		//通过FilterChain对象的doFilter()向后续的过滤器传递请求/响应
		//因为可以设置一系列的过滤器,即形成链式的过滤器结构
		//若该过滤器之后没有下一个过滤器对request请求进行规则过滤
		//则将已被过滤后的请求发给servlet,由servlet正式对该请求做出处理
		chain.doFilter(request, response);
	}
}

测试

通过书写一个简单的HTML网页对上述功能进行检查

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="search">
		用户名:<input type="text" name="username" method="get"><br>
		密码:<input type="password" name="password" >
		<input type="submit" value="登陆">
	</form>
</body>
</html>

完成!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值