目录
一、了解常识:
1.UTF-8国际编码,GBK中文编码。GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立;
2、web tomcat:默认是ISO8859-1,不支持中文的
3.java.nio.charset.Charset.defaultCharset() 获得平台默认字符编码;
4.getBytes() 是通过平台默认字符集进行编码;
根本原因就是编码不一致的问题,所以解决方式就是设置编码的方式
其中,还分为字节流和字符流的解决方式
字节流:
response.setHeader("Content-Type", "text/html;charset=UTF-8");
response.getOutputStream().write("我是字节流".getBytes("UTF-8");
字符流:
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("我是字节流");
二、实现网页定时刷新并跳转
在chapter04项目的response包中编写一个名为RefreshServlet的类,该类使用response对象的setHeader()方法实现网页的定时刷新并跳转的功能
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("Refresh","2;URL=https://blog.csdn.net/qq_55694317?spm=3001.5343");
}
在 web.xml中配置完RefreshServlet 映射后,启动Tomcat 服务器,在浏览器访问RefreshServlet,发现浏览器2 秒后自动跳转到了本人博客的首页
对文件进行修改,使当前页面每隔3秒自动刷新一次
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("Refresh","3");
response.getWriter().println(new java.util.Date());//输出当前时间
}
启动Tomcat 服务器,在浏览器访问RefreshServlet,可以看到浏览器每隔3秒刷新一次,并且输出了当前的时间。
三、实现请求重定向
为了实现请求重定向,在HttpServletResponse 接口中,定义了一个sendRedirect()方法,该方法用于生成302响应码和Location响应头,从而通知客户端重新访问Location响应头中指定的URL。
(1)在chapter04项目的WebContent目录下编写用户登录的页面login.html和登录成功的页面welcome.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action=" /chapter04/LoginServlet" method="post">
用户名:<input type="text" name="username" /><br>
密 码:<input type="password" name="password" /><br>
<input type="submit" value="登录" />
</form>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
登陆成功!
</body>
</html>
(2)在pidan.response包中编写一个名为LoginServlet 的类,用于处理用户登录请求
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
//设用户名和密码分别为:Lily 123
if (("Lily").equals(username) &&("123").equals(password)) {
//如果用户名和密码正确,重定向到welcome.html
response.sendRedirect("/chapter04/welcome.html");
}else {
//如果用户名和密码错误,重定向到login.html
response.sendRedirect("/chapter04/login.html");
}
}
在 web.xml中配置完LoginServlet 映射后,启动Tomcat 服务器
用户名“Lily”。
密码“123”,
单击登录按钮
四、 HttpServletRequest对象
获取请求行信息的相关方法
在chapter04项目的src目录下,新建一个名称为pidan.request的包,在包中编写一个名为RequestLineServlet的类,该类中编写了用于获取请求行中相关信息的方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter ();
//获取请求行的相关信息
out.println("getMethod : " + request.getMethod() + "<br />");
out.println("getRequestURI : " + request.getRequestURI () + "<br />");
out.println("getQuerystring:"+request.getQueryString() + "<br />");
out.println("getProtocol : " + request.getProtocol() + "<br />");
out.println("getContextPath:"+request.getContextPath() + "<br />");
out.println("getPathInfo :" + request.getPathInfo() + "<br />");
out.println("getPathTranslated :" + request.getPathTranslated() +"<br>");
out.println("getServletPath:"+request.getServletPath() + "<br />");
out.println("getRemoteAddr : " + request.getRemoteAddr () + "<br />");
out.println("getRemoteHost : " + request.getRemoteHost() + "<br />");
out.println("getRemotePort : " + request.getRemotePort() + "<br />");
out.println("getLocalAddr : " + request.getLocalAddr () + "<br />");
out.println ("getLocalName : " + request.getLocalName () + "<br />");
out.println("getLocalPort : " + request.getLocalPort () + "<br />");
out.println("getServerName : " + request.getServerName () + "<br />");
out.println("getServerPort : " + request.getServerPort () + "<br />");
out.println("getScheme : " + request.getScheme() + "<br />");
out.println("getRequestURL : " + request.getRequestURL() + "<br />");
}
在 web.xml中配置完RequestLineServlet 映射后,启动Tomcat 服务器
获取请求消息头的相关方法
在pidan.request包中编写一个名为RequestHeadersServlet的类,使用getHeaderNames()方法来获取请求消息头信息
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
Enumeration headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = (String) headerNames.nextElement();
out.print(headerName + " : "+ request.getHeader(headerName)+"<br />");
}
}
在 web.xml中配置完 RequestHeadersServlet 映射后,启动Tomcat服务器
HttpServletRequest 应用
在HttoServletReauest 接口的父类ServletRequest中,定义了一系列获取请求参数的方法
(1)在chapter04项目的WebContent根目录下编写一个表单文件form.html
<body>
<form action="/chapter04/RequestParamsServlet" method="POST">
用户名: <inputtype ="text"name="username"><br />
密 码:<input type="password" name="password"><br />
爱好:
<input type="checkbox" name="hobby" value="sing">唱歌
<input type="checkbox" name="hobby" value="dance">跳舞
<input type="checkbox" name="hobby" value="football">足球<br />
<inputtype ="submit" value="提交">
</form>
</body>
(2)在pidan.request包中编写一个名称为RequestParamsServlet的Servlet类,使用该Servlet获取请求参数
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name =request.getParameter("username");
String password = request.getParameter("password");
System.out.println("用户名:" + name);
System.out.println("密 码:"+ password);
String[] hobbys = request.getParameterValues("hobby");
System.out.print("爱好:");
for (int i = 0; i<hobbys.length; i++) {
System.out.print(hobbys[i]+", ");
}
}
在 web.xml中配置完 RequestParamsServlet 映射后,访问form.html页面并填写表单
单击【提交】按钮,在Eclipse的控制台打印出了每个参数的信息
五、解决请求参数的中文乱码问题
在HttpServletRequest接口中,提供了一个setCharacterEncoding()方法,该方法用于设置request对象的解码方式。对RequestParamsServlet.java进行修改
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");<!--添加这一行-->
......
启动Tomcat服务器,再次访问 form.html页面,输入中文用户名“阿巴酱”以及相关表单信息
在chapter04项目的request包中编写一个名为RequestForwardServlet的Servlet类,该类使用forword()方法将请求转发到一个新的Servlet页面
public class RequestForwardServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setAttribute("company", "重庆化工职业学院");
RequestDispatcher dispatcher =request.getRequestDispatcher("/ResultServlet");
dispatcher.forward(request, response);
}
在 request包中编写一个名为ResultServlet的Servlet类,该类用于获取RequestForwardServlet 类中保存在request对象中的数据并输出
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String company = (String) request.getAttribute("company");
if (company != null) {
out.println("学校名称:" + company + "<br>");
}
}
在web.xml中,添加完两个Servlet的映射信息后,启动Tomcat 服务器,在浏览器中访问RequestForwardServlet
可以看出,地址栏中显示的仍然是RequestForwardServlet的请求路径,但是浏览器中却显示出了ResultServlet中要输出的内容。这是因为请求转发是发生在服务器内部的行为,从RequestForwardServlet到ResultServlet属于一次请求,在一次请求中是可以使用request属性来进行数据共享的。