美文网首页
19.servlet

19.servlet

作者: 星野君 | 来源:发表于2022-05-02 11:01 被阅读0次

一、快速入门
1.pom.xml里添加依赖

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
  1. 实现接口
public class ServletDemo01 implements Servlet
  1. 重写方法,编辑访问路径
@WebServlet("/demo")
public class ServletDemo01 implements Servlet{
  @Override
  public void init(ServletConfig servletConfig) throws ServletException {
    System.out.println("hello servlet");
  }

  @Override
  public ServletConfig getServletConfig() {
    return null;
  }

  @Override
  public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

  }

  @Override
  public String getServletInfo() {
    return null;
  }

  @Override
  public void destroy() {

  }
}
  1. 正常我们不去实现servler接口,而是去继承httpservlet类
@WebServlet("/demo02")
public class ServletDemo02 extends HttpServlet {

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("get");
  }

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("post");
  }
}

二、生命周期
1.加载和实例化,默认情况下,servlet第一次访问时,由容器创建一个servlet对象,非默认情况下可以通过

@WebServlet(urlPatterns="/demo", loadOnStartup = 1)

loadOnStartup 为负整数时,就是默认情况,0或者整数时,服务器创建的时候就创建servlet对象,数字越小优先级越高

  1. 初始化,servlet实例化后,会调用init()方法完成初始化,该方法只会调用一次
  2. 请求处理,每次请求servlet的时候,容器都会调用servlet的service()方法对请求进行处理
  3. 服务终止:当需要释放内存或关闭容器时,就会调用servlet的destroy()方法完成资源的释放,调用完此方法后,容器会释放这个实例,该实例随后会被java的垃圾收集器回收

三、获取参数

  1. request.getParameter()
  2. request.getParameterValues()

解决中文参数乱码:

//post方式
request.setCharacterEncoding("UTF-8");
//post和get
String name = request.getParameter("name");
name = new String(name.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
  1. 请求转发
request.getRequestDispatcher("/demo02").forward(request,response);
//数据共享
request.setAttribute();
request.getAttribute()
  1. 重定向
//  获取虚拟目录
String contextPath = request.getContextPath();
response.sendRedirect(contextPath +"/demo02");
  1. response获取字符输出流
response.setContentType("text/html;charset=utf-8");
final PrintWriter writer = response.getWriter();
writer.write("<h>哈哈哈</h>");
  1. response字节输出流
final FileInputStream fileInputStream = new FileInputStream("d://test.jpg");
final ServletOutputStream outputStream = response.getOutputStream();
// 使用了IOUtils工具类完成拷贝
IOUtils.copy(fileInputStream, outputStream);
fileInputStream.close();

四、web.xml

  1. 命名空间
    在 web.xml 中,使用的 web-app_4_0.xsd 文件定义的规则,需要指定这个文件的位置。
<web-app 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                        http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" 
    id="WebApp_ID" version="4.0">
</web-app>
  1. Servlet配置
      这是我们常用的一个配置,主要使用的标签是<servlet></servlet>为Servlet 命名和<servlet-mapping></servlet-mapping>为 Servlet 定制 URL。
<project..>
    <servlet>
        <servlet-name>TestServlet</servlet-name>
        <servlet-class>D20210220.TestServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TestServlet</servlet-name>
        <url-pattern>/TestServlet</url-pattern>
    </servlet-mapping>
</project>

在 <servlet> 标签中, <servlet-name> 中设置的是为 Servlet 注册的名字,要保证该名字在 web.xml 文件中是唯一的,一般直接使用类名即可,<servlet-class> 中设置的是需要配置的 Servlet 的全类名。
  在 <servlet-mapping> 中, <servlet-name> 中的名字,需要和 <servlet> 中的名字一致,<url-pattern> 为这个 Servlet 映射一个对外访问路径。

servlet 和 url-pattern 之间的关系是 一对多的关系。

  1. Filter 配置
    在学习了 Servlet 的配置之后,学习 Filter 的配置就很简单了。
      Filter 的配置和 Servlet 的配置很相似,只是将 servlet 换成 filter 而已。
<filter>
    <filter-name>Filter1</filter-name>
    <filter-class>D2020128.TestFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>Filter1</filter-name>
    <url-pattern>/TestServlet</url-pattern>
</filter-mapping>

Filter 的配置中和 Servlet 配置差别较大的地方在于 url-pattern,Servlet 的 url-pattern 中配置的路径是访问 Servlet 的路径,而 Filter 的 url-pattern 中配置的路径是访问已经存在的网络资源,如静态页面、jsp、servlet等。
   filter 和 url-pattern 之间的关系是 多对多的关系。即,一个 filter 可以有多个 url-pattern(使用多个 URL 地址,都会访问同一个 FIlter),多个 filter 可以对应一个 url-pattern(多个 filter 会根据 web.xml 中配置的顺序组成 filter 链)。
  因此,Filter 的 url-pattern 有一种配置是<url-pattern>/*</url-pattern>,表示所有外部访问都需要先经过该过滤器。
   Filter 应用场景:防盗链编码过滤器

  1. Listener 配置
    Listener 不需要处理外界访问,所以它的配置不需要定制 URL,因此只需要配置<listener>
<listener>
    <listener-class>Listener的全类名<listener-class>
</listener>

注解配置

在 Servlet 3.0 版本以上,可以使用@WebServlet注解代替 web.xml 进行配置,@WebServlet的配置是一套独立的用法。

Servlet 注解配置

一般用@WebServlet( "/TestServlet1")即可,其中 TestServlet1 的位置可以自己起一个名字,但是需要注意不能在项目中有重名。

下面展示一下@WebServlet注解的复杂一些的用法,不做详解

@WebServlet(urlPatterns = "/TestServlet1",initParams = {
        @WebInitParam(name = "name1",value="value1"),
        @WebInitParam(name = "name2",value="value2")
}, name = "Hello")

Filter 注解配置
  在 Filter 类文件的开头处写上 @WebFilter("/TestFilter")

相关文章

  • 19.servlet

    一、快速入门1.pom.xml里添加依赖 实现接口 重写方法,编辑访问路径 正常我们不去实现servler接口,而...

网友评论

      本文标题:19.servlet

      本文链接:https://www.haomeiwen.com/subject/xfkqertx.html