- Servlet是运行在web服务器的Java应用程序,可以生成动态的web页面,属于客户与服务器响应的中间层。Jsp在底层就是一个servlet。
- 编写servlet
servlet中的方法有以下几种:
-
init()方法。
一个servlet在服务器上最多只会驻留一个实例。所以第一次调用servlet时,将会创建一个实例,在实例化过程中,HttpServlet中的init()方法会被调用,因此可以将一些初始化代码放在该函数内。 -
doGet()/doPost()/service()方法
- doGet()方法在以get方式请求servlet时运行。常见get请求方式有链接、get方式的表单提交、直接访问servlet。
- doPost()方法是在以post方式请求servlet时运行的。常见的post请求为post方式表单提交。
- 事实上,客户端对servlet发送一个请求过来,服务器端将会开启一个线程,该线程调用service方法,service方法根据收到的客户端的请求类型来决定是调用doGet()方法还是doPost方法,但是一般不用覆盖service()方法,使用doGet()与doPost()方法同样可以达到处理的目的。
- destory()方法,destory()方法在servlet实例消亡的时候自动调用。在web服务器运行servlet实例的时候,因为一些原因servlet对象会消亡,但是在servlet消亡之前还必须进行某些操作,例如:释放数据库连接以节省资源等,这个时候就需要重写destory()方法。
//让创建的类继承HttpServlet,重写其中的方法。
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;
/**
*@author xpengfei
*@creat 5:17:08 PM May 16, 2017
*/
public class DealWithServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
// super.doGet(req, resp);
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
// super.doPost(req, resp);
String studentName=req.getParameter("studentName");
System.out.println("学生姓名:"+studentName);
}
}
- web.xml中servlet的配置,为防止中文乱码问题的出现,可以使用过滤器进行过滤。
web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>servletLearning</display-name>
<!-- 设置全局参数,相当于全局变量,所有的servlet都可以访问 -->
<context-param>
<!-- 变量名 -->
<param-name>name</param-name>
<!-- 变量值 -->
<param-value>xpf</param-value>
</context-param>
<!-- 欢迎界面的配置 -->
<welcome-file-list>
<!-- 所要设置的欢迎界面 -->
<welcome-file>validate.jsp</welcome-file>
<welcome-file>welcome.jsp</welcome-file>
<welcome-file>Filter.jsp</welcome-file>
</welcome-file-list>
<!-- servlet的配置 -->
<servlet>
<!-- 给servlet取得名字 -->
<servlet-name>WelcomeToServlet</servlet-name>
<!-- servlet对应的包名及类名 -->
<servlet-class>servlet.WelcomeServlet</servlet-class>
</servlet>
<servlet-mapping>
<!-- 给servlet取的名字 -->
<servlet-name>WelcomeToServlet</servlet-name>
<!-- servlet类所在的目录 -->
<url-pattern>/servlet/WelcomeServlet</url-pattern>
</servlet-mapping>
<!-- 配置InitServlet类的servlet -->
<servlet>
<servlet-name>Initservlet</servlet-name>
<servlet-class>servlet.InitServlet</servlet-class>
<!-- 给该servlet设置局部参数 -->
<init-param>
<param-name>nickname</param-name>
<param-value>fei</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Initservlet</servlet-name>
<url-pattern>/servlet/InitServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>DealWithServlet</servlet-name>
<servlet-class>servlet.DealWithServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DealWithServlet</servlet-name>
<url-pattern>/servlet/DealWithServlet</url-pattern>
</servlet-mapping>
<!-- 配置过滤器(过程和配置servlet是一样的,,过滤器也是一种servlet) -->
<filter>
<!-- 设置过滤器的名字 -->
<filter-name>EncodingFilter</filter-name>
<!-- 设置类路径 -->
<filter-class>servlet.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<!-- 用于指定过滤模式
1. *符号代表所有文件
2. 写出某个servlet或jsp的路径的时候,是过滤那个指定的servlet或者jsp
3. 写出一个 目录/* 是对指定目录下的所有文件、资源进行过滤
说明:<url-pattern> 内部如果以/开头,这个/表示的是虚拟目录根目录;
-->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
过滤器代码
package servlet;
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;
/**
*@author xpengfei
*@creat 5:28:28 PM May 16, 2017
*/
public class EncodingFilter implements Filter{
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
request.setCharacterEncoding("utf-8");
chain.doFilter(request, response);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
过滤器的配置有以下几个步骤
-
用元素定义过滤器,该标签下有两个必要元素
- 元素,用来设定过滤器的名字。
- 元素,用来设定过滤器的类路径
-
用配置过滤器的映射
在元素中,用来设定过滤器的名字,另外,配置过滤器的映射主要的是元素,用于指定过滤模式。常见的过滤模式有以下三种:- 过滤所有文件
<filter-mapping>
<filter-name>FilterName</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 过滤一个或者多个servlet(jsp)
<filter-mapping>
<filter-name>FilterName</filter-name>
<url-pattern>要过滤的servlet或jsp的路径</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>FilterName</filter-name>
<url-pattern>要过滤的servlet或jsp的路径</url-pattern>
</filter-mapping>
- 过滤一个或者多个文件目录
<filter-mapping>
<filter-name>FilterName</filter-name>
<url-pattern>要过滤的文件路径</url-pattern>
</filter-mapping>
//下面的代码是过滤path目录下的所有资源
<filter-mapping>
<filter-name>FilterName</filter-name>
<url-pattern>/path/*</url-pattern>
</filter-mapping>