1. post 请求中的汉字会有乱码问题(重点)
问题引入: 现有一个form表单如下,请求方式为post
<form action="servlet1" method="post" >
男 <input type="radio" name="sex" value="男" checked>
女 <input type="radio" name="sex" value="女">
<input type="submit" value="提交">
</form>
默认选择"男",点击提交后, 控制台打印: 性别是: ç"· 出现乱码了!!!!!!!
为什么在页面中我们传递的明明是 男 ,发过来就变成这样了呢??????
原因: 编码解码字符集不一样,编码用utf-8,解码用ISO-8859-1
String sex = URLEncoder.encode("男", "utf-8");
System.out.println(sex);//%E7%94%B7
//服务器用 iso-8859-1 还原
String result = URLDecoder.decode("%E7%94%B7", "iso-8859-1");
System.out.println(result);//ç"·
解决方法,在调用 getParameter 方法之前:
request.setCharacterEncoding("utf-8");
2.request 重要方法(重点)
request.getParameter("参数名") ==> 返回参数值
request.getParameterValues("参数名") ==> 返回参数值的数组
request.setCharacterEncoding("解码的字符集");request.getMethod(); ==> 返回请求方式 get, post
request.getRequestURI(); ==> 返回当前的请求路径
request.getRemoteAddr(); ==> 获取访问者的ip地址
3. 一个请求分几个部分
GET 两个部分
GET 路径/HTTP 1.1 ==> 请求行
请求头
Host: 要访问那个虚拟主机 一个服务器下有多有 host, 每一个host 下,又有多个应用程序
Accept: 可以处理的内容格式:例如 text/html
Accept-Encoding : 能够支持的压缩格式
Accept-Language : 支持的语言, 例如 zh-CN
POST 三个部分
Content-Type: 请求体的格式 application/www-form-urlencoded (普通表单格式)
Content-Length: 请求体内容的长度
除请求行,请求头外,还有请求体
请求体
post的请求参数放入了请求体当中,例如:username=zhangsan&password=123
如果有中文,会自动编码
4. 响应分成3个部分
1) 状态码
* 200 表示响应正确返回
* 404 表示请求的资源不存在
* 500 表示服务器内部出现了异常
* 304 表示该内容没有被修改,那么服务器只会返回状态码和头,不需要返回响应体(图片,html,css,js)
* 400 请求参数格式有误.
* 403 验证没通过,或权限不足
2) 响应头
* content-type: 响应的内容格式, 例如 text/html;charset=utf8
* content-length: 响应体的长度(字节)
* Date: 响应生成时间
3) 响应体
html内容,图片内容
5.返回一个动态图片
例如:生成一个动态验证码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
function changeImage() {
document.getElementById("img").src= "servlet2?a=" + new Date().getTime();
}
</script>
</head>
<body>
<img src="servlet2" onclick="changeImage()" id="img">
</body>
</html>
@WebServlet(urlPatterns = "/servlet2")
public class Servlet2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 图片验证码
// 1. 创建图片对象, 构造参数分别代表 宽、高、图片格式
BufferedImage image = new BufferedImage(200, 100, BufferedImage.TYPE_INT_RGB);
// 2. 创建画布对象
Graphics2D g = image.createGraphics();
// 3. 填充画布
g.setColor(Color.GREEN);
g.fillRect(0,0,200,100);
// 写入文字
g.setColor(Color.BLACK);
g.setFont(new Font("微软雅黑", Font.ITALIC, 32));
String s = random(4);
g.drawString(s, 0, 32);
g.setColor(Color.RED);
g.drawLine(0,0,200,100);
// 4. 把图片内容输出到响应
resp.setContentType("image/png");
// 参数1 图片对象, 参数2 图片压缩格式 png|jpeg, 参数3: 输出字节流
ImageIO.write(image, "png", resp.getOutputStream());
}
Random random = new Random();
String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
public String random(int n) {
StringBuilder sb = new StringBuilder(n);
for (int i = 0; i < n; i++) {
int idx = random.nextInt(str.length()); // 随机的下标
sb.append(str.charAt(idx));
}
return sb.toString();
}
}
6.请求转发(重点)
servlet 中用来处理表单请求
跳转至jsp (请求转发)
jsp 用来生成html代码并返回
request.getRequestDispatcher("jsp路径").forward(request, response);
如何把servlet中的变量传递给jsp显示? 作用域传参
存 (在servlet)
request.setAttribute("变量名", 对象);
取(在jsp页面),通过 EL 表达式取
${ 变量名 }
${ 变量名.属性名 } el 表达式中的属性名,对应着java对象中的 get,set方法名
例如: 查询数据库,并把结果显示在jsp页面
@WebServlet(urlPatterns = "/servlet3")
public class Servlet3 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("servlet中执行了操作...");
// 查询了数据库
User user = new User("张三", "123");
// 向作用域存储变量, 向 request 作用域存储了一个名 u 的对象
req.setAttribute("u", user);
req.getRequestDispatcher("jsp2.jsp").forward(req,resp);
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
返回的html信息
<!-- 获取作用域中的变量 -->
${ u } <!-- User{name='张三', password='123'}-->
${ u.getPassword() } <!--123-->
</body>
</html>