一、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 {}
- 之后还有其他注解帮助开发
自用小复习。