引言
前面一篇笔记,记录了第一次使用eclipse来写jsp文件所需要配置的信息和注意事项,这篇笔记用来记录常用的request和response对象中的一些区别。
jsp内置对象
首先要明白什么是内置对象,一个对象有很多属性和方法,我们在使用这些对象中的属性和方法的时候通常会有一步操作,就是实例化对象,然后使用 点(.)操作来引用指定的属性或方法,而内置对象与之不同的是:它是系统自带的,不需要我们进行实例化操作(不用new一个对象),直接可以使用内置对象名来调用。
jsp中有九大内置对象
1.out对象
2.pageContent对象
3.**request对象:**请求对象,存储客户端向服务端
4.response对象
5.session对象
6.application对象
7.config对象
8.page对象
9.exception对象
out对象、request对象、response对象
1.out对象: 输出对象 ,向客户端输出内容,如常用其print方法来向客户端输出信息,(如:out.print(“888”))
get和post请求方式的区别
2.**request对象:**输出对象,存储客户端向服务端发送的请求信息,常用的方法有:
string getParameter(String name) //根据请求的字段名返回字段值
string[] getParameterValues(String name) //一个字段有多个值
void setCharacterEncoding("编码格式"); //设置请求编码格式
//(注意:)tomcat7及以下默认请求编码格式为iso-8859-1,tomcat8及以上默认请求编码格式为utf-8.
getRequestDispatcher("请求页面").forward(request,response) //请求转发,是页面的一种跳转方式,respons对象中也有一种页面跳转方式,往下看。
getServerContext 获取项目的ServerletContext对象。
3.**response对象:**是一个响应对象,常用的方法有:
void addCookie(Cookie cookie) 服务端向服务端增加cookie对象
void sendRedirect(String location) throws IOException
//是另外一种页面跳转的方式:重定向,
void contentType(String type) //设置服务端响应的编码,也就是设置服务端的contentType.
request对象示例(eg1)
一个简单的注册信息展示页面,register.jsp用于输入用户需要注册的信息,show.jsp用来展示注册信息的内容。
register.jsp代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="show.jsp" method="post">
<!--Tomcat8以后默认请求传递的编码为utf-8,Tomcat8以下默认为ISO-8859-1 -->
<!--以post请求方式发送的数据可以通过设置请求编码将字符正确转换为中文,而以get方式发送的不行-->
用户名:<input type="text" name="uname"><br/>
密码:<input type="password" name="upwd"><br/>
年龄:<input type="text"name="uage"><br />
爱好:<br>
<input type="checkbox" name="hobbies" value="羽毛球">羽毛球<br/>
<input type="checkbox" name="hobbies" value="网球">网球<br/>
<input type="checkbox" name="hobbies" value="桌球">桌球<br />
<input type="submit" value="注册">
</form>
</body>
</html>
show.jsp代码
<%@page import="org.apache.jasper.tagplugins.jstl.core.ForEach"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
//设置post请求编码格式
request.setCharacterEncoding("utf-8");
//获取各个表单项,通过表单元素的name属性进行获取
String uname=request.getParameter("uname");
String upwd=request.getParameter("upwd");
//age为int类型,需要进行转换
int uage=Integer.parseInt(request.getParameter("uage"));
//爱好有多个,故使用数组形式进行获取
String[] uhobbies=request.getParameterValues("hobbies");
%>
注册成功!!!<br/>
用户信息如下:<br/>
用户名:<%=uname %><br/>
密码:<%=upwd %><br/>
年龄:<%=uage %><br/>
爱好:<br/>
<%
/* 保证代码的健壮性和容错性 */
if(uhobbies!=null){
for(String hobby :uhobbies){
/*hobby=new String(hobby.getBytes("iso-8859-1"),"utf-8"); */
out.print(hobby +" ");
}
}
%>
</body>
</html>
register.jsp界面
show.jsp页面展示
form中能以get、post两种方式发送的请求方式导致的中文乱码解决办法
根据上面的代码可以正确将注册信息显示出来,如果删除了下面这行代码,就将导致中文乱码。
request.setCharacterEncoding("utf-8");
1.乱码分析
为什么删除上面这行代码,就将导致中文乱码呢,因为在上面的代码中我们指定了charset=“utf-8”,即向浏览器输出的字符编码为utf-8.而form表单在发送请求时,默认请求字符编码为iso-8859-1,由于字符编码不一致,导致了中文乱码。我们知道form表单提交的方式有两种,一种为get方式,一种为post方式,两种提交方式有一定的区别(参考博客:https://www.jb51.net/web/72554.html)
简单总结一下:
①:get方式在地址栏显示请求信息(但地址栏可容纳的信息有限,最多为2kb,form表单,用method=“get”或method="post"来指定,如果不写,默认是get方式提交
②:文件上传操作,必须是post。主要原因还是因为get方式容纳的信息有限。
2.两种提交方式涉及的字符编码问题
1)以post方式提交时,像上面一样添加这行
request.setCharsetEncoding("utf-8");
2)以get方式提交时,有两种方式来更改字符编码格式
①:统一每一个变量的编码格式(不推荐)
i)如上面**show.jsp代码中,获取用户名的时候,如果输入的是中文,可以通过这种方式,使其正确显示
String name=new String(request.getParameter("uname").getBytes("iso-8859-1","utf-8"));
ii)但获取的是一个数组,像上面的代码中爱好这一项,则需要for循环遍历,让每一项进行转码
<%
/* 保证代码的健壮性和容错性 */
if(uhobbies!=null){
for(String hobby :uhobbies){
//对每一项进行转码
hobby=new String(hobby.getBytes("iso-8859-1"),"utf-8");
/*out.print(hobby +" ");*/
}
}
%>
②:修改server.xml,一次性更改Tomcat默认get的提交方式编码(推荐使用,建议使用Tomcat时,首先在server.xml中统一get方式的编码)
在server.xml中找到这一行
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
添加URIEncoding=“utf-8”,即改成如下形式
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8”/>
response 对象实例(eg2)
一个用户登录的请求转发
1.login.jsp: 用户输入用户信息
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="check.jsp" method="post">
用户名:<input type="text" name="uname"><br/>
密码:<input type="password" name="upwd"><br/>
<input type="submit" value="登录">
</form>
</body>
</html>
2。check.jsp: 检查用输入的用户名和密码,如果正确进行重定向,否则输出提示信息,
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
//设置请求编码
request.setCharacterEncoding("utf-8");
//没有数据库,直接指定用户名
String name=request.getParameter("uname");
String pwd=request.getParameter("upwd");
if(name.equals("houyichun")&&pwd.equals("123")){
//重定向,页面跳转的一种方式
response.sendRedirect("success.jsp"); //①
//请求转发,也是页面跳转的一种方式,forward后面是固定的形式。②
/*request.getRequestDispatcher("success.jsp").forward(request, response);*/
}else{
out.print("你输入的用户名或密码有错误");
}
%>
</body>
</html>
3.success.jsp: 如果用户名和密码输入正确,重定向到该界面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
登录成功!!!
欢迎你
<%
//使用重定向,该行将获取不到数据,为null,使用请求转发,可以获取到数据
out.print(request.getParameter("uname"));
%>
</body>
</html>
请求转发和重定向的区别
请求转发和重定向都能实现页面的跳转,但有一定的区别,两种方式在check.jsp中都有写
①重定向: response对象的方法
response.sendRedirect("success.jsp"); //①
②请求转发: request对象的方法
request.getRequestDispatcher("success.jsp").forward(request, response)
主要区别有:
1)地址栏是否改变
①:请求转发不改变地址栏
上面的例子,当采用请求转发将页面跳转到success.jsp,地址栏会显示form提交的地址。
②:重定向 改变地址栏地址,变成实际请求的页面的地址。
2)是否保留第一次请求时的数据
①:请求转发能保留第一次请求传递的数据
②:重定向 不能保留第一次请传递的数据,如上图,用户名都是输入“houyichun”,但使用重定向,无法获取,显示为null.
3)请求次数
①:请求转发实际上只请求了一次
②: 重定向 实际上请求了二次