Servlet

本文详细介绍了Servlet的概念、作用以及如何创建和配置Servlet。通过示例展示了Servlet的生命周期,讲解了HttpServletRequest和HttpServletResponse的核心方法,如获取参数、设置编码、请求转发和响应输出。此外,还探讨了Servlet的初始化参数、全局初始化参数的配置与获取,并介绍了Servlet3.0的注解使用。
摘要由CSDN通过智能技术生成

1. 什么是 servlet

  • 全称Server Applet。是 Java 编写的,且交服务器容器去执行的服务端程序,主要功能在于处理Http请求。其为一个接口,用户编写实现类,将其注册到服务器容器中。
  • 工作流程 : 客户端发送请求i -> 服务器根据URL 匹配对应的Servlet 处理请求 -> 服务器将处理完毕的内容返回给客户端(servlet 操作 Response 对象来写入结果)。



2. Servlet API

在这里插入图片描述




3. 编写一个Servlet



3.1 创建web工程
  • 使用 maven 或 不使用 maven 均可。


3.2 引入 servlet 依赖
  • 方式一:使用maven
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>
  • 方式二:使用jar

         自行百度。



3.2 编写 servlet
  • 注意事项 : doGetdoPost 不要调用父类 doGet / doPost,否则 405 错误。
package com.wangnan.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class TestServlet extends HttpServlet {

    // 处理 GET
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doget---");
    }

    // 处理POST
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("dopost---");
    }
}


3.3 配置 servlet
  • web.xml
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  
  <servlet>
    <servlet-name>testServlet</servlet-name>
    <servlet-class>com.wangnan.servlet.TestServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>testServlet</servlet-name>
    <url-pattern>/test</url-pattern>
  </servlet-mapping>
</web-app>

4. 常用类



4.1 HttpServletRequest

        服务器接收到请求,并将请求报文解析成 HttpServletRequest 对象,再调用 Servlet的处理请求方法时候传入。



4.1.1 获得参数(post / get 均可获取)
  • get 请求不需要考虑传递过来的乱码怎么处理。
  • post 请求需要通过 setCharacterEncoding 来处理乱码问题。
  • 无论前端穿过来的是什么数据,后端接收都为String类型
String getParamter(String name);                    // 根据表单组件名称,获取提交的数据。

String[] getParamterValues(String name);            // 相同 name 的多个 value 


4.1.2 设置请求的编码(处理post乱码的)
void setCharacterEncoding(String name);


4.1.3 请求转发
request.getRequestDispatcher("../success.jsp").forward(request, response);


4.1.4 request 域中存取
// 存值
request.setAttribute("key", value);

// 取值
Object object = request.getAttribute("key");


4.2 . HttpServletRespone

         Servlet 的处理方法中将处理结果写入 HttpServletRespone 对象,服务器调用完毕后获得 Respone 结果, 再将其转换为响应报文,返还给客户端。



4.2.1 重定向
void sendRedirect(String val);


4.2.2 Cookie
void addCookie(Cookie val);


4.2.3 设置响应类型和编码
  • 会在响应头部添加 Content-Type ,告诉前端响应体当中的内容的类型和编码方式
void setContentType("text/html;charset=UTF-8");


4.2.4 响应体内容输出
PrintWriter getWriter();



5. Servlet 生命周期

        当客户端⾸次发送第⼀次请求后,由容器(web服务器(omcat))去解析请求, 根据请求找到对应的servlet,判断该类的对象是否存在,不存在则创建servlet实例,调取init()⽅法 进⾏初始化操作,初始化完成后调取service()⽅法,由service()判断客户端的请求⽅式,如果是get,则执⾏doGet(),如果是post则执行doPost().处理⽅法完成后,作出相应结果给客户端.单次请求处理完毕。

        当⽤户发送第⼆次以后的请求时,会判断对象是否存在,但是不再执⾏init(),⽽直接执⾏service⽅法,调取doGet()/doPost()⽅法

  • 无参构造
  • init:第一次发送请求的时候才会执行。
  • doGet/ doPost : 每次请求的时候执行。
  • destroy : 服务器关闭的时候执行。

在这里插入图片描述


6. servlet 初始化参数



6.1 为什么使用初始化参数
  • 防止硬编码,比如 request.setCharacterEncoding("UTF-8") 里面的编码指定可以放置到 web.xml中,这样当编码变动的时候,无需修改 java文件重新编译。


6.2 web.xml
<servlet>
	<servlet-name>xxx</servlet-name>
	<servlet-class>xxx</servlet-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>utf-8</param-value>
	</init-param>
</servlet>


6.3 servlet 中获取
@Override
public void init(ServletConfig config) throws ServletException {
	sout(config.getInitParamter("encoding"));
} 



7. 全局初始化参数

         全部 servlet 均可获取。



7.1 web.xml
<web-app>
	<context-param>
		<param-name>zzz</param-name>
		<param-value>ccc</param-value>
	</context-param>
</web-app>


7.2 获取
@Override
public void init(ServletConfig config) throws ServletException {
	sout(config.getServletContext().getInitParamter("encoding"));
} 


8. Servlet 3.0 注解

        使用注解的方式能省略掉 web.xml 当中的部分的配置的内容。

@WebServlet(urlPatterns = "/user", name = "testAnnoServlet", initParams = {
        @WebInitParam(name = "encoding", value = "UT-8")
}, loadOnStartup = 1)
public class TestAnnoServlet extends HttpServlet {

    @Override
    public void init(ServletConfig config) throws ServletException {
        String encoding = config.getInitParameter("encoding");
        System.out.println(encoding);
    }

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

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

!!注意: 需要使用高版本 servlet-api, 我在项目当中使用的是 4.0.1 版本。

<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>javax.servlet-api</artifactId>
	<version>4.0.1</version>
	<scope>provided</scope>
</dependency>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值