HttpServletRequest 和 HttpServletResponse
在doGet(HttpServletRequest req, HttpServletResponse resp)和doPost(HttpServletRequest req, HttpServletResponse resp)这两个方法中,都涉及到了两个参数:HttpServletRequest 和 HttpServletResponse。
所以我们肯定需要好好研究这两个参数。
HttpServletRequest 和 HttpServletResponse都是接口。
它们分别继承了ServletRequest 和 ServletResponse。
1.HttpServletRequest
HttpServletRequest封装了HTTP请求协议的全部内容,如请求方式,URI,协议版本号,表单提交的数据等等。
表示一次请求,即输入URL按回车到内容显示在屏幕上即为一次请求。
一次请求对应一个HttpServletRequest对象,100次请求对应100个HttpServletRequest对象。
常用方法:
-
获取请求参数(request对象将请求参数封装到一个Map<String,String[]>中)
String getParameter(String name);//通过key获取第一个value String[] getParameterValues(String name);//通过key获取key所对应的所有value String getParameterMap(); //获取整个参数集合 Enumeration<String> getParameterNames(); //获取参数中的所有key
-
与域对象数据有关
request域对象中的数据范围是很小的,只在一次请求中有效。
void setAttribute(String var1, Object var2); //向request域对象中存数据 Object getAttribute(String var1); //向request域对象中取数据 void removeAttribute(String var1); //移除request域对象中的数据
-
获取信息
String getRemoteAddr(); //或取客户端ip String getMethod(); //获取请求方式 String getContextPath(); //获取webapp路径下的工程名 String getRequestURI(); //获取请求的URI StringBuffer getRequestURL(); //获取请求的URL String getServletPath(); //获取servlet的路径 //下一篇文章专门将session和cookie HttpSession getSession(); //获取session对象 Cookie[] getCookies(); //获取cookie
-
设置编码
//在乱码中使用,在此处不做示范 void setCharacterEncoding(String var1) throws UnsupportedEncodingException; //设置请求参数的编码
-
请求转发
请求转发为一次请求。
RequestDispatcher getRequestDispatcher(String var1); //获取转发对象,参数为新的资源路径 //再调用RequestDispatcher的forward(request,response)进行转发
例:
web.xml:两个servlet,其中Servlet08用作请求转发的资源
<servlet>
<servlet-name>servlet07</servlet-name>
<servlet-class>com.dh.servlet.Servlet07</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet07</servlet-name>
<url-pattern>/servlet07</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>servlet08</servlet-name>
<servlet-class>com.dh.servlet.Servlet08</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet08</servlet-name>
<url-pattern>/servlet08</url-pattern>
</servlet-mapping>
login.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<form action="/servlet_01_javaweb/servlet07" method="get">
姓名:<input name="name" type="text"><br>
性别:<input name="sex" type="text"><br>
爱好:
打游戏<input name="hobby" type="checkbox" value="打游戏">
看电影<input name="hobby" type="checkbox" value="看电影">
睡觉<input name="hobby" type="checkbox" value="睡觉"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
Servlet07:
Servlet08:
测试:
点击提交之后的路径为:
结果:
equest.getContextPath():/servlet_01_javaweb
request.getMethod():GET
request.getRequestURL().toString():http://localhost:8080/servlet_01_javaweb/servlet07
request.getRequestURI():/servlet_01_javaweb/servlet07
request.getServletPath():/servlet07
request.getRemoteAddr():0:0:0:0:0:0:0:1
获取指定key的第一个value:
张三
获取指定key的所有value:
打游戏
看电影
获取所有的key:
name
sex
hobby
获取整个Map:
name=[Ljava.lang.String;@205aaba5
sex=[Ljava.lang.String;@655821ca
hobby=[Ljava.lang.String;@5940e1dc
转发:
1
以上都是一些信息的获取,最重要的是验证转发是一次请求(转发的路径为/资源名)。不需要添加/项目名
2.HttpServletResponse
HttpServletResponse中所使用的方法比较少:
PrintWriter getWriter() throws IOException; //获得输出流(输出到浏览器)
void setContentType(String var1); //设置编码
void sendRedirect(String var1) throws IOException; //重定向
void addCookie(Cookie var1); //服务器向浏览器添加cookie
例:
web.xml:
<servlet>
<servlet-name>servlet09</servlet-name>
<servlet-class>com.dh.servlet.Servlet09</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet09</servlet-name>
<url-pattern>/servlet09</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>servlet10</servlet-name>
<servlet-class>com.dh.servlet.Servlet10</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet10</servlet-name>
<url-pattern>/servlet10</url-pattern>
</servlet-mapping>
Servlet09:重定向到Servlet10
package com.dh.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class Servlet09 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//路径要/项目名/资源
response.sendRedirect("/servlet_01_javaweb/servlet10");
}
}
Servlet10:
package com.dh.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class Servlet10 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码为UTF-8,解决中文乱码问题
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer = response.getWriter();
writer.print("hello,world!");
writer.print("你好,世界!");
}
}
测试:输入http://localhost:8080/servlet_01_javaweb/servlet09
结果:会重定向到Servlet10
下一篇文章讲转发和重定向的区别,以及如何解决中文乱码的问题。