续Servlet基础二 https://blog.csdn.net/qq_42980244/article/details/96870466
1. Response
1.1 response处理页面中文乱码的问题
Response为响应
1)获得响应中的字节流 中文并无乱码情况
//获取响应中的字节流
OutputStream output = response.getOutputStream();
byte[] b = new String("你好啊!").getBytes();
output.write(b);
2)获取响应中字符流 中文乱码
解决办法:在方法第一句加上response.setContentType("text/html;charset=utf-8");
或者response.setHeader("content-type", "text/html;charset=utf-8");
//设置响应头中的页面编码格式
//response.setHeader("content-type", "text/html;charset=utf-8");
//设置content-type响应头
response.setContentType("text/html;charset=utf-8");
//获取响应中的字符流
PrintWriter writer = response.getWriter();
writer.print("我是中文");
//3s之后刷新到百度
response.setHeader("refresh", "3,url=http://www.baidu.com");
1.2 Request获取请求参数
1)用localhost:8800/XX/XXX?username=”xiaomingh”&sex=”nv”访问Servlet
其中username=”xiaomingh”&sex=”nv”为请求参数
通过request.getParameter(“username”)和request.getParameter(“sex”)可以获取等号右边的值
2)当请求参数是中文时,会出现乱码情况
根据提交方式不同,处理乱码的方式也不同
Get方式:
解决方法1:将服务器默认编码格式iso-8859-1清空转成字节数组,再把字节数组转化为utf-8的字符串byte[] b = username.getBytes("iso-8851-1");username=new String (b,"utf-8");
解决办法2:在tomcat/conf/server.xml中,connecter节点配置属性URIEncoding="utf-8";该方法针对tomcat7或以下版本,以上版本不用设置也不会出现乱码情况
Post方式:
在dipost()方法中的第一行添加request.setCharacterEncoding("utf-8");
2.Request的常用方法
getParameter() 获取请求参数,获取表单中某个元素的name属性的值
getParameterValues() 获取一个name的所有值,返回数组,常用于复选框
3.Servlet小试牛刀
获取页面传来的参数
Index.html
<!DOCTYPE html>
<html>
<head>
<title>index.html</title>
<meta name="keywords" content="keyword1,keyword2,keyword3">
<meta name="description" content="this is my page">
<meta name="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
</head>
<body>
<form action="SD" method="get">
<input name="username"><br/>
<input name="password">
爱好:
<input name="hobby" type="checkbox" value="篮球"> 篮球
<input name="hobby" type="checkbox" value="足球"> 足球
<button>提交</button>
</form>
</body>
</html>
代码:
package com.c_Servlet;
public class ServlerDemoD extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
//同一个name对应多个value--复选框
String[] hobby = request.getParameterValues("hobby");
System.out.println(username+"--"+password);
System.out.println(Arrays.toString(hobby));
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
doGet(request, response);
}
}
结果:
点击提交 控制台打印信息
4.Servlet生命周期
Servlet容器调用init()进行初始化
Servlet容器调用service()进行客户端请求处理
Servlet容器调用调用destroy()终止请求
最后JVM垃圾回收
5.Servlet对单例多线程的解释
单例:无论请求多少次Servlet,最多只有一个Servlet实例
多线程:当有多个客户端并发请求Servlet时,服务器会启动多个线程去分别执行该Servlet的service()
6.Servlet的转发与重定向
6.1转发request.getRequestDispatcher(“/XX”);
带数据的页面跳转,相当于转发数据
转发地址栏不变
一次请求,一次响应
可以访问到WEB-INF目录下的文件
6.2重定向 response.sebdRedirect(“xx”);
不带数据的页面页面跳转 相当于重新访问一个页面
重定向地址栏会改变
两次请求,两次响应
不可以访问到WEB-INF目录下的文件
6.3登陆案例(基础)
带错误信息提示+数据回显
package com.d_reqAndrespo;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//获取参数
String username = request.getParameter("username");
String pwd = request.getParameter("password");
HashMap<String,String> errorMap = new HashMap<String,String>();
//判断数据
if(username == null || username.trim().isEmpty()){
errorMap.put("uerror", "用户名不能为空");
}else if(!username.matches("^.{3,16}$")){
errorMap.put("uerror", "用户名只能是3-16位");
}
if(pwd == null || pwd.trim().isEmpty()){
errorMap.put("perror", "密码不能为空");
}else if(!pwd.matches("^\\w{6,18}$")){
errorMap.put("perror", "密码只能是6-18位数字字母下划线");
}
if(errorMap.size() > 0){//有错误
System.out.println("登陆失败");
//把错误信息设置到request域对象中
request.setAttribute("error", errorMap);
//将数据转发回登录页面
request.getRequestDispatcher("/login.jsp").forward(request, response);
}else{
//重定向到首页
response.sendRedirect("index.jsp");
System.out.println("登陆成功");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
doGet(request, response);
}
}
login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'login.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="rea">
<input name="username" value="${param.username }">
<div style="color:red;">${error.uerror }</div>
<br>
<input name="password" >
<div style="color:red;">${error.perror }</div>
<br>
<button>提交</button>
</form>
</body>
</html>