JSP实现数据传递和保存
传递:
1)获取表单提交的数据
-
请求对象:request
public String getParameter(String name)---返回对象是String类型
-
示例
-
HTML代码:
<input type="text" name="userName" />
-
JSP代码:
String userName = request.getParameter("userName");
-
a) 使用request.getParameter()获取参数
b) 用<%out.print()%>或<%=变量%>显示数据
c) url中 ,机密数据的提交不适合采用get方式
d)表单提交get与post区别 :
get从服务器上获取数据,post是向服务器上传递数据
比较项 | Get | post |
---|---|---|
参数出现在URL中 | 是(?name=xxx&pwd=aaa) | 否 |
长度限制 | 有 | 无 |
安全性 | 低 | 高 |
URL可传播 | 是 | 否 |
速度 | 速度快(查询) | 慢(增删改) |
2)获取同名多个参数
<input type="checkbox" name="mailId" value="10001" />
<input type="checkbox" name="mailId" value="10002" />
<input type="checkbox" name="mailId" value="10003" />
<input type="checkbox" name="mailId" value="10004" />
<input type="checkbox" name="mailId" value="10005" />
getParameterValues输出多个参数:
String[] mailIds = request.getParameterValues("mailId");
if(mailIds!=null && mailIds.length!=0){
//循环mailIds访问提交的数据
}else{
//未提交与参数mailId相关的数据
}
<!-- getParameterValues输出多个参数 -->
<%
String[] mailIds = request.getParameterValues("mailId");
if(mailIds!=null && mailIds.length!=0){
for(int i=0; i<mailIds.length; i++){
out.print(mailIds[i]);
}
}else{
}
%>
3)request对象常用方法
方法名称 | 说明 |
---|---|
String getParameter(String name) | 根据表单组件名称获取提交数据 |
String[ ] getParameterValues(String name) | 获取表单组件对应多个值时的请求数据 |
void setCharacterEncoding(String charset) | 指定每个请求的编码 |
RequestDispatcher getRequestDispatcher(String path) | 返回一个RequestDispatcher对象,该对象的forward( )方法用于转发请求 |
4)9大内置对象
- 请求对象:request
- 输出对象:out
- 响应对象:response
- 应用程序对象:application
- 会话对象:session
- 页面上下文对象:pageContext
- 页面对象:page
- 配置对象:config
- 异常对象:exception
5)中文乱码
一、post数据如何传递的?
form表单做提交的时候,login.jsp有内置对象request,在表单传递到dologin.jsp页面时,request对象也会传过去,同一个request对象。将数据放进request里面,一起扔给dologin.jsp。
post乱码会在dologin.jsp拿出的时候乱码。
-
JSP中默认使用的字符编码方式:iso-8859-1,不支持中文
-
常见的支持中文的编码方式:
编码方式 收录的字符 gb2312 常用简体汉字 gbk 简体和繁体汉字 utf-8 所有国家需要的字符 -
设置请求和响应的编码方式
- request.setCharacterEncoding(“utf-8”);
- response.setCharacterEncoding(“utf-8”);
- <%@ page language=“java” contentType=“text/html; charset=utf-8”%>
二、get是以路径的方式提交,在路径后面加?拼接参数
-
get请求出现乱码
-
治标的方法:new String( s.getBytes(“iso-8859-1”), “utf-8” );
-
治本的方法:配置tomcat的conf\server.xml文件
- URIEncoding=“UTF-8”
- useBodyEncodingForURI=“true”
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
-
-
使用response.sendRedirect(“url”)实现页面跳转,注册成功跳转到注册成功的页面
6) 在请求中存取属性
- 在请求中保存属性
- public void setAttribute(String name, Object o)—(属性名, 引用类型 属性值)
- request.setAttribute(“mess”, “注册失败”);
- 在请求中获取属性
- public Object getAttribute(String name)—Object:属性值;(属性名)
1、在使用属性值的时候要做非空判断,否则会出现空指针异常
2、它的返回值类型是Object类型,需要做数据类型的转换
//页面A中保存属性(然后跳转页面B)
request.setAttribute("msg", "信息");
request.getRequestDispatcher(B页面路径).forward(request, response);//跳转B
//页面B中获取属性 getAttribute获取为Object类型,需要类型转换
String mess = (String)request.getAttribute("mess");
<!-- 没有mess.length(); -->
if(mess!=null){
//在请求中取到"mess"属性对应的属性值,正常使用mess数据
}else{
//在请求中没有取到"mess"属性对应的属性值,使用备选方案
}
7) 转发与重定向
-
转发(携带参数进行跳转)
-
RequestDispatcher对象
-
forward()方法
1、request.getRequestDispatcher("url").forward(request, response) request设置属性的 2、<jsp:forward page="url" />
-
-
重定向:将用户请求重新定位到一个新的URL
response.sendRedirect("url")
getParameter: 从请求里面拿参数;返回String类型
getAttribute:从属性拿参数;返回Object类型(toString())
两者区别:
- 转发在服务器端完成的;重定向是在客户端完成的。转发使用getRequestDispatcher()方法;重定向使用sendRedirect()。
- 转发的速度快;重定向速度慢。转发是浏览器只做了一次访问请求。重定向是浏览器做了至少两次的访问请求
- 转发的是同一次请求;重定向是两次不同请求。转发2次跳转之间传输的信息不会丢失(共享request),重定向2次跳转之间传输的信息会丢失,因为重定向产生了新的请求
- 转发不会执行转发后的代码;重定向会执行重定向之后的代码
- 转发:浏览器url的地址栏不变。重定向:浏览器url的地址栏改变
- 转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成
比较项 | 转发 | 重定向 |
---|---|---|
URL变化 | 否 | 是 |
重新发出请求 | 不会 | 会 |
是否携带请求 | 是 | 否 |
目标URL要求 | 仅本Web应用 | 任意URL |
四大作用域:
-
pageContext对象
-
request对象
-
session对象
-
application对象
session在多页面显示用户名
-
使用会话对象session实现
- 一个会话就是浏览器与服务器之间的一次通话
- 会话可以在多次请求中保存和使用数据
-
session语法:
public void setAttribute(String name, Object value); 用法:session.setAttribute("username","呵呵呵");
public Object getAttribute(String name); 用法:String userName = (String)session.getAttribute("userName")
-
每个session都有一个唯一的sessionid
-
若没有清理机制,会导致性能问题或服务器崩溃
- 程序主动清除session数据
- 服务器主动清除长时间没有再次发出请求的session
-
程序主动清除session数据
-
设置会话失效:session.invalidate();
-
移除会话的属性
-
语法:public void removeAttribute(String name);
session.removeAttribute("userName");
-
-
服务器主动清除长时间没有再发出请求的seesion
-
设置会话过期时间
-
方法一:public void setMaxInactiveInterval(int interval); 单位:秒
-
方法二:
<session-config> <session-timeout>30</session-timeout> //单位:分钟 </session-config>
-
-
小结:
用浏览器访问服务器——产生会话
通过浏览器在网站登录——在会话中保存数据
登录成功后用个人身份进行访问——会话有效期内
关闭了浏览器——结束会话
服务器主动结束会话——会话到期
使会话失效、删除属性——及时释放会话资源
程序主动结束会话、会话到期——会话中的数据丢失
cookie实现自动填写用户名
-
cookie以文件方式保存数据
-
添加数据:public void addCookie(Cookie cookie)
-
获取数据:public Cookie[] getCookies()
-
设置有效期:public void setMaxAge(int expiry)
-
用户可以禁用cookie
-
application统计页面访问次数
application实现计数器
分析
每个用户都需要使用访问次数
application可在整个项目中共享使用数据
使用application实现计数器
每次访问该页面,计数器加1
解决方法
public void setAttribute(String name, Object object)
public Object getAttribute(String name)
三个对象对比
- 相同点:都可以存储属性
- 不同点:
- request中存储的数据仅在一个请求中可用
- session中存储的数据在一个会话的有效期内可用
pplication实现计数器
分析
每个用户都需要使用访问次数
application可在整个项目中共享使用数据
使用application实现计数器
每次访问该页面,计数器加1
解决方法
public void setAttribute(String name, Object object)
public Object getAttribute(String name)
三个对象对比
- 相同点:都可以存储属性
- 不同点:
- request中存储的数据仅在一个请求中可用
- session中存储的数据在一个会话的有效期内可用
- application中存储的数据在整个Web项目中可用