JSP自学NO.2

引言

前面一篇笔记,记录了第一次使用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 +"&nbsp;");
			}
		}
	%>
</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 +"&nbsp;");*/
		}
	}
%>

②:修改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)请求次数
①:请求转发实际上只请求了一次
在这里插入图片描述
②: 重定向 实际上请求了二次
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值