HttpServletRequest – 处理请求
1.请求正文 - 请求参数的获取
- 写一个form表单,其中有各种类型的输入框,通过HttpServlet请求获得所有数据
<html>
<head>
<title>注册页面</title>
</head>
<body>
<hr>
<form action="http://localhost:8080/ZuoYe" method="post">
用户名:<input type="text" placeholder="请输入用户名" name="username"><br>
密码:<input type="password" placeholder="请输入密码" name="password"><br>
性别:<br>
<input type="radio" name="sex" value="男">男<br>
<input type="radio" name="sex" value="女">女<br>
爱好:<br>
<input type="checkbox" name="hobby" value="游戏">游戏
<input type="checkbox" name="hobby" value="学习">学习
<input type="checkbox" name="hobby" value="旅游">旅游<br>
邮箱:
<input type="email" name="email"><br>
照片:
<input type="file" name="file"><br>
input
省份:
<select name="province">
<option value="河南">河南</option>
<option value="河北">河北</option>
<option value="湖北">湖北</option>
<option value="北京">北京</option>
<option value="湖南">湖南</option>
</select>
<br>
生日:<input type="date" name="date"><br>
个人简介:
<textarea name="textarea" rows="10" cols="30"></textarea>
<input type="submit" value="注册"></input>
</form>
</body>
</html>
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//post 获取请求参数
//1. String getParameter(String name):根据参数名称获取参数值
request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
String sex = request.getParameter("sex");
String province = request.getParameter("province");
String textarea = request.getParameter("textarea");
String date = request.getParameter("date");
String email = request.getParameter("email");
String file = request.getParameter("file");
//2.根据参数名称获取参数值的数组
String[] hobbies = request.getParameterValues("hobby");
System.out.println("用户名为:"+username);
System.out.println("密码为:"+password);
System.out.println("性别为:"+sex);
System.out.println("邮箱为:"+email);
System.out.println("照片为:"+file);
System.out.println("省份为:"+province);
System.out.println("生日为:"+date);
System.out.println("个人简介"+textarea);
for (int i = 0; i <hobbies.length ; i++) {
System.out.println("爱好是:"+hobbies[i]);
}
}
注意:
-
如果getParameter()的参数与input等name属性值不一致,得到的结果为null
如果getParameter()的参数与input等name属性值一致,但是没有传值,得到的结果是空字符串" "
-
复选框需要使用getParameterValues()
如果不选中任何一个复选框,那么即使复选框没有值,则返回值数组是null,即不创建数组
-
a标签是get请求,通过地址栏发送请求
在路径中手动拼接参数
路径?参数1=值1&参数2=值2
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%--
a 标签是get请求,通过地址栏发送请求
在路径中手动拼接参数
路径?参数1=值1&参数2=值2
--%>
<a href="http://localhost:8080/Demo01?id=1&age=1&birthday=2021-11-11">点击发送请求,且携带数据</a>
</body>
</html>
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String id = req.getParameter("id");
String age = req.getParameter("age");
String birthday = req.getParameter("birthday");
System.out.println(id+"--"+age+"--"+birthday);
}
2.请求转发 - forward
一种在服务器内部的资源跳转方式
浏览器发出请求,到达一个Servlet,该Servlet可以将该请求转发至其他Servlet或者其它页面(HTML,jsp)
转发至另一个Servlet
- 获得转发对象
RequestDispatcher getRequestDispatcher(path);
参数:要转发的路径
如果要转发至Servlet,此处的路径path应该是Servlet的映射路径(需要在web.xml中配置)
返回值:请求转发对象
RequestDispatcher.forward() :真正执行转发
- 执行页面
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Demo02Servlet执行了.....");
//将请求转发至下一个Servlet
/**
* 获得转发对象
* RequestDispatcher getRequestDispatcher(path)
* 参数:要转发的路径
* 如果要转发至Servlet,此处的路径应该是Servlet的映射路径(需要在web.xml中配置)
* 返回值:请求转发对象
* RequestDispatcher.forward() :真正执行转发
*/
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/Demo03");
requestDispatcher.forward(req,resp);
System.out.println("Demo02Servlet转发完成.....");
}
- 转发到的Servlet
public class Demo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Demo03执行了......");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
转发至其它页面
请求转发的特点
- 请求转发是服务器动作
- 请求转发是一次浏览器请求
- 浏览器的路径没有变化
- 请求域中的数据可以在请求转发中共享
- session域中的数据可以共享
3.请求域
HttpServletRequest对象可以当做请求域使用
请求域:理解为 req 对象内部有一片区域可以存储数据
Request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
如何存取:类似 map,存储时按照key-value存储,取出时,通过key取出value
- 请求转发时请求域数据共享
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//请求域存数据
req.setAttribute("name","张三");
//请求转发
req.getRequestDispatcher("Demo05_1").forward(req,resp);
}
- 取出数据
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//取出数据
String name = (String) req.getAttribute("name");
System.out.println(name);
}
4.session域
session是一种会话技术,用来保存会话中的数据.
特点:无论是请求转发还是重定向,session域中的数据都可以共享
- Demo09Servlet
//session回会话
public class Demo09Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/**
* 1.请求转发,可以共享session域中的数据
*/
//存入seeion
//1.获得session
HttpSession session = req.getSession();
//2.存入数据
session.setAttribute("birthday",new Date());
//3.请求转发
//req.getRequestDispatcher("/Demo10").forward(req,resp);
/**
* 2.重定向,可以共享session域中的数据
*/
//3.重定向
resp.sendRedirect(req.getContextPath()+"/Demo10");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
- Demo10Servlet
//session会话
public class Demo10Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获得seeion对象
HttpSession session = req.getSession();
//2.取出数据
Date birthday = (Date) session.getAttribute("birthday");
System.out.println(birthday);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
HttpServletResponse – 做出响应
通过HTTPServletResponse对象设置响应头,响应行,响应正文
通常不关心如何设置响应头,响应行等数据,都会有默认操作
响应正文
- 请求到达该Servlet时,做出响应,给浏览器响应一个HTML页面
public class Demo06Servlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/**
* 响应正文
*/
//resp.setCharacterEncoding("utf-8");
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
System.out.println("Demo06Servlet执行了。。。");
//做出响应,响应一个html页面
PrintWriter writer = resp.getWriter();
writer.write("<html>");
writer.write("<head>");
writer.write("<title>响应的页面</title>");
writer.write("</head>");
writer.write("<body>");
writer.write("<h1>响应成功 200 ok</h1>");
writer.write("<hr>");
writer.write("<div style=\"width:300px;height:300px;background-color:red\">块</div>");
writer.write("<html>");
writer.write("</body>");
writer.write("</html>");
}
}
重定向
请求到达该Servlet,通过响应对象,进行重定向,可以让浏览器重新再请求一个Servlet或页面
- 重定向到其它Servlet:
resp.sendRedirect(path);
请求到达Demo07Servlet,Demo07Servlet设置响应重定向,告知浏览器重新请求Demo08Servlet
- Demo07Servlet
public class Demo07Servlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Demo07Servlet执行了。。。");
//响应,设置重定向
//重定向到Demo08Servlet,此处不能加/,加/是到浏览器根路径,会缺乏项目名
resp.sendRedirect("Demo08");
//向请求域添加数据
req.setAttribute("age",18);
}
}
- Demo08Servlet
public class Demo08Servlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Demo08Servlet执行了。。。。");
//取出请求域中的数据
Object age = req.getAttribute("age");
System.out.println(age);//null
}
}
- 重定向到其它页面
重定向的特点:
- 浏览器行为
- 两次请求
- 地址栏变化
- 请求域中的数据在重定向的多个Servlet不能共享
- seeion域中的数据可以共享
乱码问题
1.响应乱码
resp.setContentType("text/html;charset=utf-8");
2.请求乱码
req.setCharacterEncoding("utf-8");
总结
请求 响应
1.如何处理请求 – HttPServletRequest
- 获得请求头,行,正文:
req.getXxx
- 请求转发:
req.getRequestDispatcher(path).forward(req,resp)
- 请求域:
- 存入数据:
req.setAttribute(key,value)
- 取出数据:
req.getAttribute(key)
- 存入数据:
- session域
- 获取seesion对象:
HttpSession session = req.getSession()
- 存入数据:
session.setAttribute(key,value)
- 取出数据:
session.getAttribute(key)
- 获取seesion对象:
2.如何处理响应 – HttpServletResponse
- 响应正文:
PrintWriter out = resp.getWriter()
- 重定向:
resp.sendRedirect()