JSP实现数据传递和保存

你天生与众不同,注定不会被淹没在人群中。
You can’t blend in when you were born to stand out.

JSP里的内置对象

JSP已经准备好的,可以直接使用的对象

  • 请求对象:request
  • 输出对象:out
  • 响应对象:response
  • 应用程序对象:application
  • 会话对象:session
  • 页面上下文对象:pageContext
  • 页面对象:page
  • 配置对象:config
  • 异常对象:exception

Request对象:

  • Request对象表示客户端的HTTP请求,包含了客户端发送给服务器的信息。在JSP中,可以使用Request对象来获取客户端发送的数据,如表单数据、URL参数等。

一些Request对象的常用方法包括:

  • String getParameter(String name):根据表单组件名称获取提交数据。

  • String[ ] getParameterValues(String name):获取表单组件对应多个值时的请求数据

  • getAttribute(String name): 获取请求属性的值。

  • getRequestDispatcher(String path): 返回一个RequestDispatcher对象,该对象的forward( )方法用于转发请求.

  • getSession(): 获取与该请求关联的会话对象。

  • void setCharacterEncoding(String charset):指定每个请求的编码

Response对象:

  • Response对象用于生成服务器响应,包含了将发送给客户端的信息。在JSP中,可以使用Response对象设置响应的内容,如设置响应头、写入响应体等。

一些Response对象的常用方法包括:

  • setContentType(String type): 设置响应的内容类型。
  • setHeader(String name, String value): 设置响应头的值。
  • getWriter(): 获取用于向客户端输出字符数据的PrintWriter对象。
  • sendRedirect(String location): 将客户端重定向到指定的URL。

通过Request对象,JSP页面可以获取客户端发送的数据并进行处理,而通过Response对象,JSP页面可以生成动态内容并将其发送回客户端。这两个对象在JSP开发中扮演着至关重要的角色,帮助开发人员处理HTTP请求和生成HTTP响应。

get 和post 的区别

在Web开发中,HTTP协议定义了客户端(通常是浏览器)和服务器之间进行通信的规则。其中,GET和POST是HTTP请求方法,用于向服务器请求或提交数据。

  1. GET请求

    • 使用URL传递参数,参数会显示在URL中,可被书签保存,有长度限制。
    • GET请求会将请求参数附加在URL的末尾,例如http://www.example.com/page?name=value.
    • 通常用于获取数据,对服务器资源的请求不应该对数据进行更改。
    • GET请求在浏览器中刷新时会重复请求。
  2. POST请求

    • 使用HTTP请求主体传递参数,参数不会暴露在URL中,不受长度限制。
    • POST请求将请求参数放在HTTP请求的主体中,而不是URL中。
    • 通常用于提交数据,对服务器资源的请求可能会对数据进行更改。
    • POST请求在浏览器中刷新时不会重复提交表单数据。

在Java Servlet中,通过doGet()doPost()方法来处理GET和POST请求。doGet()方法用于处理GET请求,doPost()方法用于处理POST请求。这两种请求方法可以在Servlet中使用,具体的处理逻辑可以根据请求类型进行区分和处理。
在这里插入图片描述

get和post中文乱码

因为JSP中默认使用的字符编码方式:iso-8859-1,不支持中文。

所以我们以下方法来解决这个问题:

post请求:
在Java中,可以使用request.setCharacterEncoding(“UTF-8”);来设置请求的字符编码为UTF-8。这样可以确保正确解析中文字符。

在返回响应时,确保设置正确的字符编码。也可以使用response.setCharacterEncoding(“UTF-8”);来设置响应的字符编码为UTF-8。

get请求:
对于GET请求中的中文参数,确保在获取参数值之前进行URL解码。可以使用URLDecoder类来解码URL参数,例如:

String decodedParam = URLDecoder.decode(request.getParameter("param"), "UTF-8");
页面跳转

在Java web开发中,JSP转发(forward)和重定向(redirect)是两种常用的页面跳转方式,它们在实现页面跳转时有一些区别。

  1. 转发(Forward)
    • 转发是服务器内部的跳转方式,整个过程只有一次请求,浏览器地址栏不会改变。
    • 在转发过程中,浏览器发送一次请求到服务器,服务器内部将请求转发给另一个资源(可以是JSP、Servlet等),最终由该资源来响应请求。
    • 转发是在服务器端完成的,客户端浏览器不知道服务器进行了转发操作,因此在浏览器中看不到转发的过程。
    • 适用于在同一个Web应用内部的页面跳转,共享请求的信息。

代码:用到了我们在上面学习的request.getRequestDispatcher

request.getRequestDispatcher("url").forward(request, response)
<jsp:forward page="url" />
  1. 重定向(Redirect)
    • 重定向是一种客户端跳转方式,会向浏览器发送一个特殊的响应码,告诉浏览器去请求另一个URL,因此会发起两次请求。
    • 在重定向中,服务器会返回一个特殊的响应码(如302 Found),告诉浏览器去请求另一个URL,然后浏览器会发送新的请求到该URL。
    • 重定向会导致浏览器地址栏的URL发生改变,因为浏览器会发起新的请求。
    • 适用于不同Web应用之间的页面跳转,或者希望在跳转时清除之前请求的信息。

代码:

response.sendRedirect("url")

小计:

  • 如果希望在同一个Web应用内部进行页面跳转,并且希望共享请求的信息,通常使用转发。
  • 如果需要进行不同Web应用之间的页面跳转,或者需要清除之前请求的信息,通常使用重定向。

在这里插入图片描述

在实际应用中,根据具体的需求和场景选择合适的跳转方式是很重要的。

session对象

我们发现用request.setattribute设置属性时,在转发(forward)的情况下,数据可以在转发到的页面中使用response.getattributr访问到,但是在我们使用重定向跳转后,重定向的页面就无法使用response.getattributr访问到了。

这是因为在重定向(redirect)的情况下,数据是通过 URL 参数传递的,而不是通过请求属性传递的。当使用重定向时,浏览器会向新的 URL 发送一个完全独立的请求,因此之前设置在请求属性中的数据在重定向后的新请求中是不可用的。

在重定向情况下,可以通过以下方式在页面之间传递数据:

  1. URL 参数:在重定向时,可以将数据作为 URL 参数附加在重定向的 URL 上,然后在新页面中通过请求对象的方法获取这些参数值。

示例代码:

// 在 Servlet 中使用重定向并传递参数
response.sendRedirect("newPage.jsp?username=JohnDoe");

在新页面(newPage.jsp)中,可以通过以下方式获取参数值:

<%@ page language="java" contentType="text/html; pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <title>New Page</title>
</head>
<body>
    <h1>Welcome, <%= request.getParameter("username") %></h1>
</body>
</html>

通过 URL 参数传递数据是在重定向时常用的方式,因为在重定向后的新请求中,请求属性是不可用的。

2.session对象

可以使用会话(session)来存储和传递数据。会话是在客户端和服务器之间保持状态的机制,可以在整个用户会话期间持续存储数据。

当需要在不同请求之间共享数据时,可以使用会话(session)来存储和传递数据。会话是在客户端和服务器之间保持状态的机制,可以在整个用户会话期间持续存储数据。

在 Java Web 应用程序中,可以通过 Session 对象来管理会话数据。Session 对象可以存储键值对形式的数据,这些数据将在整个用户会话期间保持有效。

示例代码:

// 在 Servlet 中使用 HttpSession 存储数据
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
    HttpSession session = request.getSession();
    session.setAttribute("username", "JohnDoe");

    // 重定向到另一个页面
    response.sendRedirect("newPage.jsp");
}

在新页面(newPage.jsp)中,可以通过以下方式获取会话中存储的数据:

<%@ page language="java" contentType="text/html; pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <title>New Page</title>
</head>
<body>
    <h1>Welcome, <%= session.getAttribute("username") %></h1>
</body>
</html>

在这个例子中,HttpSession 对象通过session.setAttribute("username", "JohnDoe");来存储用户名信息,并且在重定向后的新页面中可以通过 session.getAttribute("username") 获取到这个信息。这样就实现了在不同请求之间共享数据的目的。

session清除和过期

在Web应用程序中,会话(session)可以通过多种方式进行清除或过期处理,以确保安全性和资源管理。以下是一些常见的方法来清除和处理会话过期:

  1. 手动清除:可以通过调用session.invalidate()方法手动清除会话。这会立即终止当前会话,并清除其中的所有数据。

    HttpSession session = request.getSession();
    session.invalidate()
    
  2. 移除会话的一个属性:removeAttribute(String name)方法用于从会话中移除指定名称的属性。这个方法非常有用,可以帮助您在不需要某个属性时清除会话中的特定数据

    // 设置属性到会话中
    session.setAttribute("username", "JohnDoe");
    
    // 移除名为 "username" 的属性
    session.removeAttribute("username");
  1. 会话过期时间设置:在web.xml中可以配置会话的过期时间。可以通过设置<session-config>元素中的<session-timeout>来指定会话的过期时间(以分钟为单位)。

    <session-config>
        <session-timeout>30</session-timeout> <!-- 会话过期时间为30分钟 -->
    </session-config>
    
  2. 监听器(Listener):可以实现HttpSessionListener接口来监听会话的创建和销毁事件,从而在会话过期时执行特定的操作。

    public class MySessionListener implements HttpSessionListener {
        public void sessionCreated(HttpSessionEvent event) {
            // 会话创建时执行的操作
        }
    
        public void sessionDestroyed(HttpSessionEvent event) {
            // 会话销毁时执行的操作
        }
    }
    
  3. 定时任务:可以使用定时任务来检查会话的最后访问时间,并手动清除过期的会话。

    HttpSession session = request.getSession();
    long lastAccessedTime = session.getLastAccessedTime();
    long currentTime = System.currentTimeMillis();
    
    if (currentTime - lastAccessedTime > session.getMaxInactiveInterval() * 1000) {
        session.invalidate();
    }
    

这些方法可以根据具体的需求和场景来选择,确保会话数据的安全性和有效性。通过适当的管理和处理,可以有效地控制会话的生命周期并提高系统的性能和安全性。

cookie对象

什么是Cookie?

Cookie是在客户端(通常是浏览器)存储的小型文本文件,由服务器发送到客户端,并在客户端的计算机上存储。它们用于跟踪用户会话、存储用户偏好设置、记录用户行为等。通过使用Cookie,Web服务器可以向客户端发送数据,并在后续请求中接收这些数据,从而实现状态管理和个性化体验。

Cookie的用途:

  1. 跟踪用户会话:通过在Cookie中存储会话标识符,服务器可以识别用户并保持会话状态。
  2. 记住用户偏好:网站可以使用Cookie存储用户喜好和设置,以提供个性化的体验。
  3. 购物车功能:在电子商务网站中,Cookie可用于存储购物车内容。
  4. 记住登录状态:通过Cookie存储登录凭据,用户可以在下次访问时保持登录状态。
  5. 跟踪用户行为:网站可以使用Cookie记录用户浏览历史和行为,以便提供相关推荐内容。

如何添加数据到Cookie:

在JSP中,可以使用内置对象responseaddCookie()方法来添加Cookie。以下是一个示例代码:

<%
Cookie cookie = new Cookie("username", "JohnDoe");
response.addCookie(cookie);
%>

获取Cookie数据:

可以使用内置对象requestgetCookies()方法来获取客户端发送的所有Cookie,并遍历它们以获取特定Cookie的值。
在Java中,Cookie类提供了getName()和getValue()方法来获取Cookie的名称和值。

  • getName(): 这个方法用于获取Cookie的名称,即Cookie的键。
  • getValue():这个方法用于获取Cookie的值,即Cookie的内容。

以下是一个示例代码:

<%
Cookie[] cookies = request.getCookies();
if (cookies != null) {
    for (Cookie cookie : cookies) {
        if (cookie.getName().equals("username")) {
            String username = cookie.getValue();
            out.println("Username: " + username);
        }
    }
}
%>

设置Cookie的有效期:

可以通过调用Cookie对象的setMaxAge()方法来设置Cookie的有效期,以秒为单位。设置为正数表示Cookie将在指定秒数后过期,设置为负数表示Cookie会话级别有效,设置为0表示立即删除Cookie。以下是一个示例代码:

<%
Cookie cookie = new Cookie("username", "JohnDoe");
cookie.setMaxAge(3600); // Cookie有效期为1小时
response.addCookie(cookie);
%>

禁用Cookie:

如果需要在浏览器中禁用Cookie,可以通过浏览器设置来实现。用户可以在浏览器中禁用Cookie,或者在特定网站上设置不接受Cookie。在服务器端,可以通过在响应中设置Set-Cookie头部来指示浏览器不保存Cookie,如下所示:

<%
response.setHeader("Set-Cookie", "username=JohnDoe; Max-Age=0; Path=/");
%>

这将告诉浏览器立即删除名为"username"的Cookie。请注意,即使在服务器端发送了这个头部,用户仍然可以通过浏览器设置来控制是否接受Cookie。

application对象

在Java Servlet中,ServletContext对象代表了整个web应用程序的运行环境,它是在web应用程序启动时由web容器创建的。ServletContext对象提供了一种在整个应用程序范围内共享信息的方式。在JSP中,application对象是ServletContext对象的一个引用,通过它可以访问ServletContext对象提供的功能。

application对象的主要特点和用途包括:

  1. 全局数据共享application对象允许在整个web应用程序中共享数据。这意味着在不同的页面或会话之间共享数据变得容易。

  2. 应用程序范围的属性存储:可以使用application对象存储应用程序范围内的属性,这些属性对整个应用程序可见。这些属性可以在整个应用程序的生命周期内保持不变。

  3. 初始化参数application对象允许访问web应用程序的初始化参数,这些参数在web.xml文件中配置。这些参数可以在应用程序中全局访问。

  4. 事件监听器:通过application对象,可以注册应用程序级别的事件监听器,以便在应用程序的生命周期中处理特定事件。

常用的application对象的方法:

  • setAttribute(String name, Object value): 将一个属性存储在application对象中。
  • Object getAttribute(String name): 获取存储在application对象中的属性。
  • Enumeration<String> getAttributeNames(): 返回application对象中所有属性的名称的枚举。
  • void removeAttribute(String name): 从application对象中移除指定名称的属性。

在JSP中如何使用application对象:

在JSP中,可以直接使用application对象来访问ServletContext对象提供的功能。以下是一个简单的示例,演示如何向application对象中存储属性,并在另一个JSP页面中获取这些属性:

<!-- 存储属性 -->
<%
application.setAttribute("appName", "MyWebApp");
%>

<!-- 获取属性 -->
<%
String appName = (String) application.getAttribute("appName");
out.println("Application Name: " + appName);
%>

通过使用application对象,可以方便地在整个应用程序范围内共享数据和属性,实现全局的数据访问和共享。

request、session、application之间的相同点和不同点

相同点

  • 都可以存储属性

不同点

  1. request中存储的数据仅在一个请求中可用
  2. session中存储的数据在一个会话的有效期内可用
  3. application中存储的数据在整个Web项目中可用
  • 39
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

分才

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值