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-------------");
}
}
- init()在收到请求时被调用
- service()在处理请求时被调用
- 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>
完成!