一、中文乱码问题
中文乱码问题:
- get方式:tomcat 8 已经将get方式乱码问题解决了
- post方式:会乱码 *
解决:在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”);
一般我们再dopost里写代码,在doget里面,只需要调用this.dopost(request,response)就好
getParameter是根据html中的name来获取的
tomcat什么配置就不说了,(这里我们的虚拟目录是bbb)这里我们定义一个servlet类Servlet_zhongwenluanma,注解写**@WebServlet("/de1")**,又定义一个a.html:跳转到
<form action="/bbb/de1" method="post">
(这里html记得要写/bbb再/de1哦)
a.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试</title>
</head>
<body>
<form action="/bbb/de1" method="post">
<input type="text" placeholder="请输入用户名:" name="username"><br>
<input type="text" placeholder="请输入密码:" name="password"><br>
<input type="checkbox" name="hobby" value="study">学习
<input type="checkbox" name="hobby" value="game">游戏
<br>
<input type="submit" value="注册">
</form>
</body>
</html>
Servlet_zhongwenluanma.java:
package cn.it.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;
/**
* @author QLBF
* @version 1.0
* @date 2020/11/22 18:44
*/
@WebServlet("/de1")
public class Servlet_zhongwenluanma extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.设置流的编码
request.setCharacterEncoding("utf-8");
//post 获取请求参数
//根据参数名称获取参数值
// String username = request.getParameter("username");
// System.out.println(username);
// System.out.println("------------");
//根据参数名称获取参数值的数组
// String[] hobbies = request.getParameterValues("hobby");
// for (String hobby : hobbies) {
// System.out.println(hobby);
// }
//获取所有请求的参数名称,但获取复选框,只能获取第一条,所以我们用getParameterMap
// Enumeration<String> parameterNames = request.getParameterNames();
// while (parameterNames.hasMoreElements()){
// String name = parameterNames.nextElement();
// System.out.print(name+":");
// String value = request.getParameter(name);
// System.out.println(value);
// System.out.println("-----");
//
// }
// 获取所有参数的map集合
Map<String, String[]> parameterMap = request.getParameterMap();
//遍历
Set<String> set = parameterMap.keySet();
for (String name : set) {
//获取键获取值
String[] values = parameterMap.get(name);
System.out.print(name+":");
for (String value : values) {
System.out.println(value);
}
System.out.println("------");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
二、request请求转发forward
请求转发:一种在服务器内部的资源跳转方式
转发就是:
步骤:
- 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
特点:
- 浏览器地址栏路径不发生变化
虽然也跳转到demo99访问了,但浏览器不会变
- 只能转发到当前服务器内部资源中。
就是在demo88里面不能写RequestDispatcher requestDispatcher = request.getRequestDispatcher(“www.baidu.com”);只能访问你电脑服务器的
- 转发是一次请求
新建Servlet_demo8和9的servlet类:
Servlet_demo8:
package cn.it.web.forward;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author QLBF
* @version 1.0
* @date 2020/11/22 20:02
*/
@WebServlet("/demo88")
public class Servlet_demo8 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo88被访问了...");
//转发到demo99资源,这里/可以不用,或者写成./也可以,但demo99要写,不然别人不知道你转发到哪里,转发不需要虚拟目录,重定向要。
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/demo99");
requestDispatcher.forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
Servlet_demo9:
package cn.it.web.forward;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author QLBF
* @version 1.0
* @date 2020/11/22 20:03
*/
@WebServlet("/demo99")
public class Servlet_demo9 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo99被访问了...");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
然后通过浏览器输入:http://localhost:8080/bbb/demo88(bbb是我的虚拟目录)
然后控制台就会输出:
就完成了转发的操作了。
共享数据域对象
共享数据:
- 域对象:一个有作用范围的对象,可以在范围内共享数据
- request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
- 方法:
- void setAttribute(String name,Object obj):存储数据
- Object getAttitude(String name):通过键获取值
- void removeAttribute(Stringname):通过键移除键值对
比如上面的demo88和demo99改下:
package cn.it.web.forward;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author QLBF
* @version 1.0
* @date 2020/11/22 20:02
*/
@WebServlet("/demo88")
public class Servlet_demo8 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo88被访问了...");
//转发到demo99资源
//RequestDispatcher requestDispatcher = request.getRequestDispatcher("/demo99");
//requestDispatcher.forward(request,response);
//存储数据到request域中
request.setAttribute("msg","hello!!!");
request.getRequestDispatcher("/demo99").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
99:
package cn.it.web.forward;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author QLBF
* @version 1.0
* @date 2020/11/22 20:03
*/
@WebServlet("/demo99")
public class Servlet_demo9 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取数据
Object msg = request.getAttribute("msg");
System.out.println(msg);//输出hello
System.out.println("demo99被访问了...");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
在浏览器访问:
控制台输出:
就是demo99可以共享demo88给他的数据,通过键获得值。