获取表单提交的数据:
JSP(Java Server Pages)
从浏览器到服务器是浏览器发送请求(request)
从服务器到浏览器是浏览器接收响应(response)
【通过JSP来实现】
request对象:
主要用于处理客户端请求
request对象常用方法:
方法名称 | 说明 |
String getParameter(String name) | 根据表单组件名称获取提交数据 |
String[ ] getParameterValues(String name) | 获取表单组件对应多个值时的请求数据 |
Void setCharacterEncoding(String charset) | 指定每个请求的编码 |
RequestDispatcher getRequestDispatcher(String path) | 返回一个RequestDispatcher对象,该对象的forward( )方法用于转发请求 |
URL getContextPath() | 获得上下文路径的路径指的就是到WebRoot |
示例汇总:
1. 请求对象:request
request作用域:请求的范围,在一次请求的范围内
public String getParameter(String name)
HTML代码:
<input type= "text" name= "userName" >
JSP代码:
String userName =request.getParameter("userName );
注:有快捷键Ctrl+Alt+向下的箭头就能复制上一行
2. 获取同名的多个参数
HTML代码:
<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" />
JSP代码:
String[ ] mailId=request.getParameterValues("mailId ");
if(mailId!=null& mailId.length!=0){
//循环mailds访问提交的数据
}else{
//未提交与参数maild相关的数据
}
表单提交到JSP,中文乱码问题解决方法:
编码方式 | 收录的字符 |
gb2312 | 常用简体汉字 |
Gbk | 简体和繁体汉字 |
utf-8 | 所有国家需要的字符 |
不同表单提交方式,解决方法不同:
get与post区别:
比较项 | get | post |
参数出现在URL中 | 是 | 否 |
长度限制 | 有 | 无 |
安全性 | 低 | 高 |
URL可传播 | 是 | 否 |
1. get提交方式的中文乱码解决办法:
方法一:治标
语法:
字符串.getBytes("ISO-8859-1"),"utf-8"
示例:
String userName = request.getParameter("username");
userName=new String(userName.getBytes("ISO-8859-1"),"utf-8");
方法二:治本
配置tomcat\conf\server.xmI文件
<Connector connectionTimeout " 20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
2. post提交方式的中文乱码解决办法:
在提交的JSP页面填入一句代码
语法:
request.setCharacterEncoding("utf-8");
3. 使用request转移信息中中文乱码解决办法:
语法:
传递部分使用URLEncoder.encode()来设置编码
现字符串 = URLEncoder.encode(原字符串, "UTF-8");
接收部分使用URLDecoder.decode()来解码
现字符串= URLDecoder.decode(原字符串, "UTF-8");
在请求中存取属性:
1. 在请求中保存属性:
public void setAttribute(String name,Object o)
request.setAttribute("mess", "注册失败");
request.setAttribute()的作用域仅限于一次请求
2. 在请求中获取属性
public Object getAttribute(String name)
注:
3. 在使用属性值的时候要做非空判断,否则会出现空指针异常
示例:
String mess=request.getAttribute(" mess");
mess.length();
这么写是错的,应该先判断:
String mess=(String)request.getAttribute("mess");
if(mess!=null){
//在请求中取到"mess"属性对应的属性值,正常使用mess数据
}else{
//在请求中没有取到"mess"属性对应的属性值,使用备选方案
}
4. 它的返回值类型是Object类型,需要做数据类型的转换
JSP内置对象response:
response对象用于响应客户请求并向客户端输出信息
页面重定向(见下方详细说明):
- void sendRedirect(String location)
- 客户端将重新发送请求到指定的URL
转发与重定向:
1. 转发(页面实现跳转了,请求的信息也一起转移)
用户进行一次请求,但是服务器内部自动完成了跳转,服务器的行为无形中延长了request作用域;所以用户看到的地址栏并不是应该的最后的跳转地址,依然是上一个地址。
RequestDispatcher对象
forward()方法
示例:
- request.getRequestDispatcher("url"),forward(request,response)
- <jsp;forward page="url" />
2. 重定向(页面实现跳转了,但是请求的信息不一起转移)
用户进行一次请求,服务器只是提示用户要跳转但是自己没有进行跳转,所以不会转移信息。
将用户请求重新定位到一个新的URL
response.sendRedirect("url")
如果想让重定向也能传递信息要使用如下方法:
String mess = "成功";
mess = URLEncoder.encode(mess, "UTF-8");
response.sendRedirect(request.getContextPath()+"/index.jsp?mess="+mess);
在转到页面要使用如下方法:
String mess = request.getParameter("mess");
mess = URLDecoder.decode(mess, "UTF-8");
out.println(mess);
其中:?参数=的语法结构就是在传递参数;但是在传递中文时会出现乱码的情况,详细介绍请看前面的“中文乱码的解决”。
3. 转发与重定向的区别
转发:
- 转发是在服务器端发挥作用,将同一请求在服务器资源之间进行传递
- 客户端浏览器的地址栏不会显示转向后的地址
重定向:
- 重定向是在客户端发挥作用,通过发送一个新的请求实现页面转向
- 在地址栏中可以显示转向后的地址
比较项 | 转发 | 重定向 |
URL变化 | 否 | 是 |
重新发出请求 | 不会 | 会 |
是否携带请求 | 是 | 否 |
目标URL要求 | 仅本Web应用 | 任意URL |
重定向是客户端行为,转发是服务器行为
内置对象:
JSP已经准备好的,可以直接使用的对象(其中前五个比较重要):
1. 请求对象:request :主要用于处理客户端请求的数据信息
2. 输出对象:out :用于向客户端输出数据
用来输出和System.print不同,不用点出来
3. 响应对象:response :用于响应客户端请求并向客户端输出信息
4. 应用程序对象:application :类似于系统的全局变量,用于实现Web应用中的资源共享
5. 会话对象:session :用于记录会话状态的相关信息
6. 页面上下文对象:pageContext
7. 页面对象:page
8. 配置对象:config
9. 异常对象:exception
其中的page可以理解成this(当前对象,作用域最小) 作用域仅限于当前页面,只能在当前页面访问到attribute
session中的setAttribute()作用域是一次会话:
会话:一个会话就是浏览器和服务器之间的一次通话;会话可以在多次请求中保存和使用数据;一个会话就是在一段时间内,一个客户端与Web服务器的一连串相关的交互过程;会话可以在多次请求中保存和使用数据:
public void setAttribute(String name, Object value);
用法:session.setAttribute("userName","张三丰");
public Object getAttribute(String name);
用法:String username=(String) session.getAttribute("userName");
session与窗口的关系:
- 每个session对象都与一个浏览器窗口对应 ,重新开启一个浏览器窗口,可以重新创建一个session对象(不同版本浏览器可能有所差别)
- 通过超链接打开的新窗口,新窗口的session与其父窗口的session相同
session是一种机制,是服务器端使用的用来记录同一个客户端状态的一个机制—sessionId来判断哪个客户端:session.getId(); public String getId(); 【得到当前客户端的编号,每一个session有一个唯一的sessionId】
同一个浏览器不管打开多少次都会显示同一个客户ID;不同的浏览器的到的客户ID不同
session是单用户、多页面可共享,session是保存在服务器端的
session对象常用方法:
方法名称 | 说明 |
String getId() | 获取sessionid |
void setMaxInactiveInterval(int interval) | 设定session的非活动时间 |
int getMaxInactiveInterval() | 获取session的有效非活动时间(以秒为单位) |
void invalidate() | 设置session对象失效 |
void setAttribute(String key, Object value) | 以key/value的形式保存对象值 |
Object getAttribute(String key) | 通过key获取对象值 |
void removeAttribute(String key) | 从session中删除指定名称(key)所对应的对象 |
会话的清除和过期:
Session的数据是在服务器端的,服务器保存的会话数据量会越来越大,从而导致性能问题;所以若没有清理机制,会导致性能问题或服务器崩溃:
1. 程序主动清除session数据
手动设置失效:session.invalidate() 【程序里最常用的方法】
移除会话的一个属性:
public void setAttribute(String name);
用法:session.removeAttribute("userName");
2. 服务器主动清除长时间没有再次发出请求的session
设置会话过期时间超时失效:
方法一:通过setMaxInactiveInterval( )方法,单位是秒
public void setMaxInactiveInterval (int Interval);
示例:
<%
session.setAttribute("login","admin");
session.setMaxInactiveInterval(600);
response.sendRedirect("admin.jsp");
%>
方法二:通过设置项目的web.xml或Tomcat目录下的/conf/web.xml文件,单位是分钟
<session-config>
<session-timeout>10</session-timeout>
</session-config>
include指令:
除了首页面,其它页面中同样需要加入登录验证,有没有办法避免冗余代码的出现?
可以将一些共性的内容写入一个单独的文件中,然后通过include指令引用该文件
方法一:
创建登录验证文件 loginControl.jsp
示例:
<%
String login = (String) session.getAttribute("login");
if (login == null) {
response.sendRedirect("index.jsp");
return;
} %>
方法二:
在后台首页面中使用include指令引用登录验证文件
示例:
<%@ include file="loginControl.jsp" %>
JSP内置对象application:
application实现用户之间的数据共享
application对象的常用方法
方法名称 | 说 明 |
void setAttribute(String key,Object value) | 以key/value的形式保存对象值 |
Object getAttribute(String key) | 通过key获取对象值 |
String getRealPath(String path) | 返回相对路径的真实路径 |
示例:统计网站访问次数的实现:
一个用户进行多次刷新页面
多个用户访问页面
分析:
- 每个用户都需要使用访问次数
- application可在整个项目中共享使用数据
- 使用application实现计数器
- 每次访问该页面,计数器加1
解决方法:
public void setAttribute(String name, Object object)
application.setAttribute(String name, Object object);
public Object getAttribute(String name)
application.getAttribute(String name);
统计页:
<%
Integer count = (Integer) application.getAttribute("count");
if (count != null) {
count = 1 + count;
} else {
count = 1;
}
application.setAttribute("count", count);
%>
显示页:
<%
Integer i = (Integer) application.getAttribute("count");
out.println("您好,您是第 " + i + " 位访问本网站的用户");
%>
但是服务器停了之后重新启动就会重新计数
三个对象对比:
request、session、application
相同点:都可以存储属性
不同点:
- request中存储的数据仅在一个请求中可用
- session中存储的数据在一个会话的有效期内可用
- application中存储的数据在整个Web项目中可用
JSP常用内置对象的作用域:
1. page作用域:
对应的作用域访问对象为pageContext 对象
page的作用域指本JSP页面的范围:
pageContext.setAttribute(键,值)
pageContext.getAttribute(键)
2. request作用域:
对应的作用域访问对象为request 对象
request的作用域内的对象则是与客户端的请求绑定在一起
3. session作用域:
对应的作用域访问对象为session 对象
session的作用域是一次会话
4. application作用域:
对应的作用域访问对象为application 对象
application的作用域是面对整个Web应用程
cookie:
跟踪用户的整个会话
cookie通过在客户端记录信息;给客户端发送一个通行证,每一个客户一个
cookie的本质:
Web服务器保存在客户端的一小段文本信息
cookie的作用:
- 对特定对象的追踪
- 实现各种个性化服务
- 简化登录
安全性能:容易泄露信息
cookie以文件方式保存数据:
创建cookie对象:
Cookie newCookie = new Cookie(String key, String value);
添加数据:
public void addCookie(Cookie cookie)
response.addCookie(newCookie);
获取数据:
public Cookie[] getCookies() 【返回值是一个数据】
Cookie[] cookies = request.getCookies();
设置有效期:
public void setMaxAge(int expiry)
只要打开一个浏览器访问一个服务器时默认会发回来一个cookie名字是JsessionID,内容是一串数字和字母合起来。所以可以知道session是基于cookie的。
cookie对象的常用方法:
方法名称 | 说 明 |
void setMaxAge(int expiry) | 设置cookie的有效期,以秒为单位 |
void setValue(String value) | 在cookie创建后,对cookie进行赋值 |
String getName() | 获取cookie的名称 |
String getValue() | 获取cookie的值 |
int getMaxAge() | 获取cookie的有效时间,以秒为单位 |
setPath("/") | 设置返回值,加上setPath("/");这句话说明cookie对于整个工程是可见的,如果不加这句话cookie只对当前这个路径和它的子目录可见; |
当在cookie中使用中文的时候会出现中文乱码,此时要使用encode设置编码和decode解码来实现:
示例:
1. encode设置编码
userName = URLEncoder.encode(userName, "UTF-8");
Cookie cookie = new Cookie("username",userName);
2. decode解码
username = cookies[i].getValue();
username = URLDecoder.decode(username, "UTF-8");
cookie与session的对比:
1. session:
- 在服务器端保存用户信息
- session中保存的是Object类型
- 随会话的结束而将其存储的数据销毁
- 保存重要的信息
2. Cookie
- 在客户端保存用户信息
- cookie保存的是 String类型
- cookie可以长期保存在客户端
- 保存不重要的用户信息
JavaBean:
- 就是一个Java类
- 封装业务逻辑
- 封装数据
JavaBean的优势:
- 解决代码重复编写,减少代码冗余
- 功能区分明确
- 提高了代码的维护性
从JavaBean的功能上可以分为:
- 封装数据
- 封装业务
封装数据的JavaBean:
技巧:
使用工具自动生成getter/setter方法:
Alt+Shift+S ---> Generate Getters and Setters
除了要建立的util包之外一般还有service包:
名字都是:***Service:接口 <--- 业务逻辑
Dao(接口)---> DaoImpl(接口实现类):数据库的数据操作
一般一个Dao对应一张数据表(*******)
总结: