Servlet了解
1 Servlet介绍
Servlet用于接收及响应前端发送的请求,可以在同一个Servlet中处理多个请求,也可以定义返回的数据类型。
Servlet和JSP之间的关系
先有的Servlet再有JSP,JSP文件执行需要先翻译成java文件(servlet),然后再进行编译成class文件,最后执行
查找路径:eclipse中配置本地的Tomcat,项目启动运行后,在Tomcat的work中查找
2 Servlet入门案例
需求:定义Servlet接收前端发送的登录请求,对请求进行处理
<form action="loginServlet" method="post">
<input type="text" name="uname">
<input type="submit" value="提交">
</form>
//自定义的Servlet要继承HttpServlet
public class LoginServlet extends HttpServlet {
/**
* Servlet中提供了service方法用于接收及响应web客户端的请求
* service可以执行多次(每次请求都会执行该方法)
* super.service(req, resp);用于请求分发
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("------service------");
//设置编码
request.setCharacterEncoding("utf-8");
//获取请求中的参数
String uname = request.getParameter("uname");
if(uname.equals("admin")){
//重定向
response.sendRedirect("success.jsp");
} else{
response.sendRedirect("fail.jsp");
}
}
}
servlet配置
<!--
配置Servlet,指定请求地址与Servlet之间的对应关系
servlet-name:给Servlet指定一个唯一标识
servlet-class:指定servlet所在的位置
-->
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>cn.yunhe.servlet.LoginServlet</servlet-class>
</servlet>
<!--
给指定的Servlet配置请求路径
servlet-name:指定该路径要关联的servlet
url-pattern:指定请求地址(特别注意必须给/[web项目的根目录])
-->
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/loginServlet</url-pattern>
</servlet-mapping>
3 Servlet生命周期
Servlet的生命周期依赖于web容器的生命周期,生命周期划分为:初始化(一次)、执行(多次)、销毁(一次)。
public LifeCycleServlet(){
System.out.println("-----LifeCycleServlet构造器执行-------");
}
@Override
public void init() throws ServletException {
System.out.println("------LifeCycleServlet 初始化执行--------");
super.init();
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("------LifeCycleServlet service执行--------");
}
@Override
public void destroy() {
System.out.println("------LifeCycleServlet destroy执行--------");
super.destroy();
}
默认Servlet的初始化是在web客户端发送对应的请求到Servlet的时候,才会被初始化(不用就不初始化)
4 Servlet配置
4.1 加载顺序
配置Servlet加载顺序(默认是使用的时候才初始化),需要在配置Servlet的时候去指定load-on-startup标签
<servlet>
<servlet-name>LifeCycleServlet</servlet-name>
<servlet-class>cn.yunhe.servlet.LifeCycleServlet</servlet-class>
<!--设置Servlet在web容器初始化的时候也进行初始化-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>LifeCycleServlet</servlet-name>
<url-pattern>/lifeCycleServlet</url-pattern>
</servlet-mapping>
初始化顺序:值越大越靠后加载,值一样按照在xml文件中的配置顺序,靠后的先加载,如果不写该标签,只有在第一次请求的时候才会初始化
4.2 全局参数与局部参数
局部参数只在对应的Servlet中使用,全局参数是在所有的Servlet中都可以使用
<!--配置Servlet-->
<servlet>
<servlet-name>paramServlet</servlet-name>
<servlet-class>cn.yunhe.servlet.ParamServlet</servlet-class>
<!--设置局部参数-->
<init-param>
<param-name>count</param-name>
<param-value>1</param-value>
</init-param>
</servlet>
获取结果
//获取局部变量参数
String count = getInitParameter("count");
System.out.println("ParamServlet count="+count);
全局变量配置
<!--Servlet的全局变量-->
<context-param>
<param-name>name</param-name>
<param-value>application</param-value>
</context-param>
//获取全局变量(需要获取到上下文对象)
ServletContext servletContext = getServletContext();
String value = servletContext.getInitParameter("name");
System.out.println("ApplicationParamServlet name="+value);