Servlet 学习总结(四)

本文总结了Servlet的HttpServletRequest接口,包括其生命周期、获取请求数据的方法及请求转发的概念。还讨论了web应用中资源跳转的两种方式——转发和重定向的区别。最后,介绍了Servlet3.0引入的注解开发,如@WebServlet,以提高开发效率并简化配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、HttpServletRequest

1、完整类名:jakarta.servlet.http.HttpServletRequest

2、HttpServletRequest接口的父接口:ServletRequest

public interface HttpServletRequest extends ServletRequest {}

3、HttpServletRequest对象中都有什么信息?

  • HttpServletRequest对象是Tomcat服务器负责创建的。里面封装了HTTP的请求协议。

  • 实际上是用户发送请求的是时候,遵循了HTTP协议,发送的是HTTP的请求协议,Tomcat服务器将HTTP协议中的信息以及数据全部解析出来,然后Tomcat服务器把这些信息封装到HttpServletRequest对象当中,传给了我们javaweb程序员。

  • javaweb程序员面向HttpServletRequest接口编程,调用方法就可以获取到请求的信息了。

4、request和response对象的生命周期。

  • request对象和response对象,一个是请求对象,一个是响应对象。这两个对象只在当前请求中有效。

  • 一次请求对应一个request。

  • 两次请求则对应两个request。

5、HttpServletRequest接口的一些方法

  • 怎么获取前端浏览器用户提交的数据?
Map<String,String[]> getParameterMap() 这个是获取Map
Enumeration<String> getParameterNames() 这个是获取Map集合中所有的key
String[] getParameterValues(String name) 根据key获取Map集合的value
String getParameter(String name)  获取value这个一维数组当中的第一个元素。这个方法最常用。
// 以上的4个方法,和获取用户提交的数据有关系。

注意:前端提交的永远是字符串,后端获取的也永远是字符串。

  • “请求域“对象
    • 请求域(request对象里的请求域)
    • 请求域只在当前请求内有效,请求结束后这个请求域就销毁了。
  • 请求域对象的几个方法
    • void setAttribute(String name, Object obj); // 向域当中绑定数据。
      Object getAttribute(String name); // 从域当中根据name获取数据。
      void removeAttribute(String name); // 将域当中绑定的数据移除
  • 请求转发的概念(注意:请求转发也只是一次请求)
    •         
      // 第一步:获取请求转发器对象
      RequestDispatcher dispatcher = request.getRequestDispatcher("/b");
      // 第二步:调用转发器的forward方法完成跳转/转发
      dispatcher.forward(request,response);
      
      // 第一步和第二步代码可以联合在一起。
      request.getRequestDispatcher("/b").forward(request,response);
      
  • 需要注意的是:两个Servlet怎么共享数据?
    • 可以通过请求转发的方法共享数据。
  • 转发的也可以是静态资源。注意路径是不加项目名的,以“/”开头。
  • 还有一些常用方法:
// 获取客户端的IP地址
String remoteAddr = request.getRemoteAddr();

// get请求在请求行上提交数据。
// post请求在请求体中提交数据。
// 设置请求体的字符集。(显然这个方法是处理POST请求的乱码问题。这种方式并不能解决get请求的乱码问题。)
// Tomcat10之后,request请求体当中的字符集默认就是UTF-8,不需要设置字符集,不会出现乱码问题。
// Tomcat9前(包括9在内),如果前端请求体提交的是中文,后端获取之后出现乱码,怎么解决这个乱码?执行以下代码。
request.setCharacterEncoding("UTF-8");

// 在Tomcat9之前(包括9),响应中文也是有乱码的,怎么解决这个响应的乱码?
response.setContentType("text/html;charset=UTF-8");
// 在Tomcat10之后,包括10在内,响应中文的时候就不在出现乱码问题了。以上代码就不需要设置UTF-8了。

// 注意一个细节
// 在Tomcat10包括10在内之后的版本,中文将不再出现乱码。(这也体现了中文地位的提升。)

// get请求乱码问题怎么解决?
// get请求发送的时候,数据是在请求行上提交的,不是在请求体当中提交的。
// get请求乱码怎么解决
// 方案:修改CATALINA_HOME/conf/server.xml配置文件
<Connector URIEncoding="UTF-8" />
// 注意:从Tomcat8之后,URIEncoding的默认值就是UTF-8,所以GET请求也没有乱码问题了。
    
// 获取应用的根路径
String contextPath = request.getContextPath();

// 获取请求方式
String method = request.getMethod();

// 获取请求的URI
String uri = request.getRequestURI();  // /aaa/testRequest

// 获取servlet path
String servletPath = request.getServletPath(); //   /testRequest

二、在一个web应用中完成资源的跳转的两种方式

1、在一个web应用中通过两种方式,可以完成资源的跳转:

  • 第一种方式:转发

  • 第二种方式:重定向

2、转发和重定向有什么区别?

  • 转发
  • // 获取请求转发器对象
    RequestDispatcher dispatcher = request.getRequestDispatcher("/dept/list");
    // 调用请求转发器对象的forward方法完成转发
    dispatcher.forward(request, response);
    
    // 合并一行代码
    request.getRequestDispatcher("/dept/list").forward(request, response);
    // 转发的时候是一次请求,不管你转发了多少次。都是一次请求。
    // AServlet转发到BServlet,再转发到CServlet,再转发到DServlet,不管转发了多少次,都在同一个request当中。
    // 这是因为调用forward方法的时候,会将当前的request和response对象传递给下一个Servlet。
  • 重定向
  • // 注意:路径上要加一个项目名。为什么?
    // 浏览器发送请求,请求路径上是需要添加项目名的。
    // 以下这一行代码会将请求路径“/oa/dept/list”发送给浏览器
    // 浏览器会自发的向服务器发送一次全新的请求:/oa/dept/list
    // 也就是一次重定向,两次请求
    response.sendRedirect("/oa/dept/list");
  • 形式上有什么区别?
    • 转发(一次请求)
      • 转发是web服务器来控制的,完成资源的跳转,实际上浏览器地址栏并没有发生改变。
    • 重定向(二次请求)
      • 重定向是浏览器完成的,相当于浏览器地址栏上发生了两次请求。
  • 如何选择请求转发和重定向
    • 如果需要向请求域中携带数据,并转发到另一个servlet,那么使用请求转发。
    • 否则使用重定向(重定向用的多)
  • 跳转的资源可以是静态也可以是动态的。
  • 注意:请求转发将涉及到浏览器刷新问题。

三、Servlet注解,简化配置

1、Servlet3.0版本之后,推出了各种Servlet基于注解式开发。优点是什么?

  • 开发效率高,不需要编写大量的配置信息。直接在java类上使用注解进行标注。

  • web.xml文件体积变小了。

  • 以后的开发将会使用注解+配置文件开发。

2、第一个注解:jakarta.servlet.annocation.WebServlet

  • 在Servlet类上使用:@WebServlet,WebServlet注解中的一些属性。
name属性:用来指定Servlet的名字。等同于:<servlet-name>
urlPatterns属性:用来指定Servlet的映射路径。可以指定多个字符串。<url-pattern>
loadOnStartUp属性:用来指定在服务器启动阶段是否加载该Servlet。等同于:<load-on-startup>
value属性:跟name属性一样,当注解的属性名是value的时候,使用注解的时候,value属性名是可以省略的。
注意:不是必须将所有属性都写上,只需要提供需要的。(需要什么用什么。)
注意:属性是一个数组,如果数组中只有一个元素,使用该注解的时候,属性值的大括号可以省略。
  • 注解对象的使用格式:
    • @注解名称(属性名=属性值, 属性名=属性值, 属性名=属性值....)
    • @WebServlet(value={"/my/servlet"})
      public class MyServlet extends HttpServlet {}
      @WebServlet({"/my/servlet"})
      public class MyServlet extends HttpServlet {}
      @WebServlet("/my/servlet") // 可以省略
      public class MyServlet extends HttpServlet {}

    • 之后还有其他注解帮助开发        

自用小复习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值