目录
request、session、application三个对象对比
获取表单提交的数据
请求对象:request
public String getParameter(String name)
HTML代码:<input type="text" name="userName" />
JSP代码:String userName = request.getParameter("userName");
get与post区别
比较项 | Get | post |
---|---|---|
参数出现在URL中 | 是 | 否 |
长度限制 | 有 | 无 |
安全性 | 低 | 高 |
URL可传播 | 是 | 否 |
比较项 | get | post |
---|---|---|
缓存 | 可以 | 不可以 |
收藏为书签 | 可以 | 不可以 |
数据长度 | 有限制(URL 的最大长度是 2048 个字符) | 无限制 |
编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。 |
对数据类型的限制 | 只允许 ASCII 字符 | 没有限制。也允许二进制数据 |
安全性 | 不安全 | 安全 |
可见性 | 数据在 URL 中对所有人都是可见的 | 数据不会显示在 URL 中 |
request对象常用方法
方法名称 | 说明 |
---|---|
String getParameter(String name) | 根据表单组件名称获取提交数据 |
String[ ] getParameterValues(String name) | 获取表单组件对应多个值时的请求数据 |
void setCharacterEncoding(String charset) | 指定每个请求的编码 |
RequestDispatcher getRequestDispatcher(String path) | 返回一个RequestDispatcher对象,该对象的forward( )方法用于转发请求 |
内置对象
JSP已经准备好的,可以直接使用的对象
1.请求对象:request
request 对象是 javax.servlet.httpServletRequest类型的对象。
2.输出对象:out
out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。
3.响应对象:response
response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。
4.应用程序对象:application
application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。
5.会话对象:session
session 对象是由服务器自动创建的与用户请求相关的对象
6.页面上下文对象:pageContext
pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。
7.页面对象:page
page 对象代表JSP本身,只有在JSP页面内才是合法的。
8.配置对象:config
config 对象的主要作用是取得服务器的配置信息。
9.异常对象:exception
exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。
jsp脚本
<%-- 该部分注释在网页中不会被显示--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
language:指定JSP页面使用的脚本语言
import:通过该属性来引用脚本语言中使用到的类文件
contentType:用来指定页面的MIME类型,以及字符编码方式
<%@page import="包路径"%> //导包
<% 代码块 %>
<%=变量名 %> //用于输出变量
<%!public String testMethod(String param) {//定义方法
return param;
}
%>
<%=testMethod("参数") %> //调用方法
内置对象---out对象
实现数据的输出显示
out.print("输出...")
内置对象---request对象
请求对象(主要用途,接收用户发送过来的数据)
<input type="text" name="userName" />
//name属性名userName使用 发送与接收要对应
String userName = request.getParameter("userName");
// 如果遇到多个name相同的情况(checkbox)
String userLoves = request.getParameterValues("userLoves");
中文乱码
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请求出现乱码
治标的方法: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"/>
//post请求使用
request.setCharacterEncoding("utf-8"); //请求乱码
response.setCharacterEncoding("utf-8");//响应乱码
//get请求使用
new String(变量.getBytes("iso-8859-1"), "utf-8" );
或
配置tomcat\conf\server.xml文件Connector 标签中
URIEncoding="UTF-8"
useBodyEncodingForURI="true"
在请求中存取属性
在请求中保存属性
public void setAttribute(String name,Object o)
request.setAttribute("mess", "注册失败");
在请求中获取属性
public Object getAttribute(String name)
注意:
1、在使用属性值的时候要做非空判断,否则会出现空指针异常
2、它的返回值类型是Object类型,需要做数据类型的转换
转发与重定向
转发
RequestDispatcher对象
forward()方法
1、request.getRequestDispatcher("url").forward(request, response)
2、<jsp:forward page="url" />
重定向
将用户请求重新定位到一个新的URL
response.sendRedirect("url")
转发与重定向的区别
比较项 | 转发 | 重定向 |
---|---|---|
URL变化 | 否 | 是 |
重新发出请求 | 不会 | 会 |
是否携带请求 | 是 | 否 |
目标URL要求 | 仅本Web应用 | 任意URL |
注意:重定向是客户端行为,转发是服务器行为
//转发
request.getRequestDispatcher(B页面路径).forward(request, response);
//重定向
response.sendRedirect("url")
区别: 1.转发url没有发生变化,而重定向会 2.转发不会重新发送请求,重定向会 3.转发可以携带参数,而重定向不可以 4.转发只可跳转当前项目路径,而重定向可以跳转任意url
使用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的工作方式
每个session都有一个唯一的sessionid
public String getId();
session.getId();
会话的清除和过期
若没有清理机制,会导致性能问题或服务器崩溃
程序主动清除session数据
服务器主动清除长时间没有再次发出请求的session
程序主动清除session数据
设置会话失效:session.invalidate();
移除会话的一个属性
public void removeAttribute(String name);
用法:session.removeAttribute("userName");
服务器主动清除长时间没有再次发出请求的session
设置会话过期时间
方法一: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
//cookie的使用
//如果有中文
username = URLEncoder.encode(username,"utf-8");
Cookie cookie = new Cookie("username",username);
//设置路径,这个路径即该工程下都可以访问该cookie 如果不设置路径,那么只有设置该cookie路径及其子路径可以访问
cookie.setPath("/");
//设置cookie生命周期
cookie.setMaxAge(60*60);
response.addCookie(cookie);
获取cookie
Cookie[] cookies = request.getCookies();
if(cookies!=null && cookies.length!=0){
for(int i=0;i<cookies.length;i++){
System.out.println(cookies[i].getName());
if(cookies[i].getName().equals("username")){
username = cookies[i].getValue();
username = URLDecoder.decode(username,"utf-8");
}
}
}
application实现计数器
每个用户都需要使用访问次数
application可在整个项目中共享使用数据
使用application实现计数器
每次访问该页面,计数器加1
request、session、application三个对象对比
相同点: 都可以存储属性
不同点: request中存储的数据仅在一个请求中可用
session中存储的数据在一个会话的有效期内可用
application中存储的数据在整个Web项目中可用