Java Web中JSP实现数据传递和保存重点总结

获取表单提交的数据:

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对象用于响应客户请求并向客户端输出信息

页面重定向(见下方详细说明):

  1. void sendRedirect(String location)
  2. 客户端将重新发送请求到指定的URL

 

转发与重定向:

1. 转发(页面实现跳转了,请求的信息也一起转移

用户进行一次请求,但是服务器内部自动完成了跳转,服务器的行为无形中延长了request作用域;所以用户看到的地址栏并不是应该的最后的跳转地址,依然是上一个地址。

RequestDispatcher对象

forward()方法

示例:

  1. request.getRequestDispatcher("url"),forward(request,response)
  2. <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. 转发与重定向的区别

转发:

  1. 转发是在服务器端发挥作用,将同一请求在服务器资源之间进行传递
  2. 客户端浏览器的地址栏不会显示转向后的地址

重定向:

  1. 重定向是在客户端发挥作用,通过发送一个新的请求实现页面转向
  2. 在地址栏中可以显示转向后的地址

比较项

转发

重定向

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与窗口的关系:

  1. 每个session对象都与一个浏览器窗口对应 ,重新开启一个浏览器窗口,可以重新创建一个session对象(不同版本浏览器可能有所差别)
  2. 通过超链接打开的新窗口,新窗口的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)

返回相对路径的真实路径

示例:统计网站访问次数的实现:

一个用户进行多次刷新页面

多个用户访问页面

分析:

  1. 每个用户都需要使用访问次数
  2. application可在整个项目中共享使用数据
  3. 使用application实现计数器
  4. 每次访问该页面,计数器加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

相同点:都可以存储属性

不同点:

  1. request中存储的数据仅在一个请求中可用
  2. session中存储的数据在一个会话的有效期内可用
  3. 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的作用:

  1. 对特定对象的追踪
  2. 实现各种个性化服务
  3. 简化登录

安全性能:容易泄露信息

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:

  1. 在服务器端保存用户信息
  2. session中保存的是Object类型
  3. 随会话的结束而将其存储的数据销毁
  4. 保存重要的信息

2. Cookie

  1. 在客户端保存用户信息
  2. cookie保存的是 String类型
  3. cookie可以长期保存在客户端
  4. 保存不重要的用户信息

JavaBean:

  1. 就是一个Java类
  2. 封装业务逻辑
  3. 封装数据                 

JavaBean的优势:

  1. 解决代码重复编写,减少代码冗余
  2. 功能区分明确
  3. 提高了代码的维护性

从JavaBean的功能上可以分为:

  1. 封装数据
  2. 封装业务

封装数据的JavaBean:

技巧:

使用工具自动生成getter/setter方法:

Alt+Shift+S ---> Generate Getters and Setters

除了要建立的util包之外一般还有service包:

名字都是:***Service:接口 <--- 业务逻辑

Dao(接口)---> DaoImpl(接口实现类):数据库的数据操作

一般一个Dao对应一张数据表(*******)

总结:

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值