servlet

Posted @想太多先森

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了servlet相关的知识,希望对你有一定的参考价值。

/**
Model1:
jsp  ---> 显示页面  业务逻辑
javaBean


Model2
jsp-->页面显示
servlet -->业务逻辑
javaBean



servlet:
01.实现类servlet接口的类 就是 servlet  !  我们常认为的!
02.就是一个servlet接口!

实现servlet的三种方式
01.实现Servlet接口
02.继承GenericServlet
03.继承 HttpServlet    常用的

HttpServlet--》继承GenericServlet--》实现Servlet接口


servlet的生命周期:
1.客户端发送请求---》servlet
2.根据用户的请求 查询对应的servlet
3.加载servlet到内存中
4.servlet实例化--》调用init()初始化servlet
5.根据用户的请求方式,service()来派发到不同的方法处理(doGet(),doPost())
6.服务器关闭,执行destroy()销毁servlet

*/

 

 

 sevlet的功能:

 01.接收用户的请求   post   get  文件上传  下载

 02.处理请求  取得前台的值  调用后台service层的代码

 03.返回响应   重定向   转发  错误界面

 

/*
 * 实现servlet的三种方式
 * 01.实现Servlet接口
 * 02.继承GenericServlet抽象类
 * 03.继承HttpServlet抽象类   常用的方式
 * 
 * HttpServlet     继承  GenericServlet  
 * GenericServlet  实现   Servlet 接口
 * 
 * 
 * HttpServletRequest   继承了 ServletRequest
 * HttpServletResponse  继承了 ServletResponse
 */
public class MyServlet extends HttpServlet { //常用的方式
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("初始化信息  Init   项目启动的时候不会初始化  " +
                "用户访问servlet的时候实例化 只被 执行一次");
    }

    @Override
    public void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    System.out.println("派发器 用户每请求一次,就会执行一次,接收用户的请求时get还是post");
       super.service(request, response);  //必须是 调用 父类的service方法 否则 死循环!
    }
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("这是一个DoGet请求  只要是get请求 每次都执行");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("这是一个DoPost请求 ");
    }

    @Override
    public void destroy() {
        System.out.println("关闭服务器的时候 销毁  destroy  只被 执行一次");
    }
}
创建一个MyServlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    
    <!--配置servlet -->
    <servlet> <!-- 定义servlet -->
      <servlet-name>myServlet</servlet-name>
      <servlet-class>cn.bdqn.servlet.MyServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
      <servlet-name>myServlet</servlet-name>
      <url-pattern>/myServlet</url-pattern>  <!-- 控制用户的请求路径 -->
    </servlet-mapping>
    
    
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
web.xml文件的配置

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP \'index.jsp\' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>
  
  <body>
  
<form action="myServlet" method="post">
   <button type="submit">提交</button>
</form>
  </body>
</html>
创建一个jsp页面

运行之后后台的输出结果

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    
    <!--配置servlet -->
    <servlet> <!-- 定义servlet -->
      <servlet-name>myServlet</servlet-name>
      <servlet-class>cn.bdqn.servlet.MyServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
      <servlet-name>myServlet</servlet-name>
      <url-pattern>/jsp/</url-pattern>  <!-- 控制用户的请求路径 -->
    </servlet-mapping>
    <!-- 
    url-pattern的四种匹配模式       / 代表项目的根目录
    01.精确匹配               /myServlet   ==>  localhost:8080/项目名/myServlet
    02.全局匹配  /*   匹配到项目下的 所有请求
       localhost:8080/项目名/sasasa  能匹配
       localhost:8080/项目名/1234  能匹配
    03.后缀匹配      *.do  前面不管输入的是什么,但是必须有.do
    04.目录匹配   /jsp/*    ===》localhost:8080/项目名/jsp/随便输入
     -->
    
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
web.xml文件中设置url-pattern的匹配模式
 <!--配置servlet -->
    <servlet> <!-- 定义servlet -->
      <servlet-name>myServlet</servlet-name>
      <servlet-class>cn.bdqn.servlet.MyServlet</servlet-class>
      <!--初始化需要的参数信息  -->
      <init-param>
       <param-name>name</param-name>
       <param-value>小黑</param-value>
      </init-param>
    </servlet>
    
    <servlet-mapping>
      <servlet-name>myServlet</servlet-name>
      <url-pattern>/MyServlet</url-pattern>  <!-- 控制用户的请求路径 -->
    </servlet-mapping>
初始化参数的配置web.xml文件
 @Override
    public void init(ServletConfig config) throws ServletException {
        String initParameter = config.getInitParameter("name");
        System.out.println("初始化的参数是:"+initParameter);
        System.out.println("初始化信息  Init   项目启动的时候不会初始化  " +
                "用户访问servlet的时候实例化 只被 执行一次");
    }
修改对应的MyServlet文件中的init方法

现在我们在MyServlet中可以访问初始化的参数了!

但是如果后续我又创建了其他的Servlet,我还想用到初始化参数,而且初始化参数都是一致的! 怎么办?难道在每个servlet节点下面都创建init-param吗?

不需要  我们只需要 配置 context-param节点

<!--初始化ServletContex的参数信息   所有的servlet共享的参数 -->
    <context-param>
    <param-name>name</param-name>
    <param-value>小黑</param-value>
    </context-param>
web.xml文件中新增
public class MyServlet2 extends HttpServlet {
    /*
     * ServletContext:多个servlet共享的资源!
     * 如果我们把每一个Servlet当成一个局部变量,
     * 那么ServletContext就是一个全局的!
     */
    @Override
    public void init(ServletConfig config) throws ServletException {
        String initParameter = config.getServletContext().getInitParameter("name");
        System.out.println("MyServlet2初始化的参数是:"+initParameter);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String initParameter =request.getServletContext().getInitParameter("name");
        System.out.println("MyServlet2初始化的参数是:"+initParameter);
        System.out.println("这是一个DoGet请求  只要是get请求 每次都执行");
    }
}
创建一个新的Servlet获取公共的初始化参数,必须要在web.xml文件中配置新创建的servlet节点
@Override
    public void init(ServletConfig config) throws ServletException {
         String initParameter =config.getServletContext().getInitParameter("name");
        System.out.println("MyServlet初始化的参数是:" + initParameter);
        System.out.println("MyServlet初始化信息  Init   项目启动的时候不会初始化  "
                + "用户访问servlet的时候实例化 只被 执行一次");
    }
修改之前的Servlet中的init方法

在浏览器中 分别输入两个servlet的地址,查看效果 都会获得初始化的参数

 

 

 

以上是关于servlet的主要内容,如果未能解决你的问题,请参考以下文章

servlet和filter的区别

Java基础——JSP

java---servlet与filter的联系与区别

servlet,filter,listener,intercepter区别

Tomcat根据JSP生成Servlet机制解析

servlet,过滤器,监听器,拦截器的区别