69期-Java SE-045_JSP-2

 

### JSP

Servlet+JSP

Servlet 主要负责完成与客户端的数据交互,提供业务数据。

JSP 负责视图层的展示工作。

Servlet 接收到客户端请求,根据具体的需求完成相关业务,同时将业务数据传给 JSP,JSP 对业务数据进行解析。

JSP HTML 页面中可以嵌入 Java 代码。

1、JSP 脚本

```java
<%
Java代码
%>
```

2、JSP 声明

```java
<%!
声明一个全局方法
%>
```

3、JSP 表达式

```java
<%=Java变量%>
```



### JSP 内置对象

request、response、pageContext、session、application、config、out、page、exception

常用的 pageContext、request、response、session、application



request:

- String getParameter(String key)
- void setAttribute(String key,Object value)
- Object getAttribute(String key)
- void setCharacterEncoding(String charset)
- String[] getParameterValues(String key)
- RequestDispatcher getRequestDispatcher(String path)



response:

- sendRedirect(String path) //重定向

转发表示将同一个请求在服务端进行转移,相当于你给客服打电话,客服将你的电话转接给售后。

重定向表示让客户端发送一个新的请求来访问跳转之后的页面,相当于你给客户打电话,客服给你一个新的电话号码,让你给新号码打电话。

转发的特点是地址栏的 URL 不变,因为是同一次请求,服务器跳转,在服务端完成资源的跳转。

重定向的特点是地址栏的 URL 会发生改变,因为是两次不同的请求,客户端跳转,相当于从客户端发起一次新的请求。

重定向的弊端在于 request 中保存的数据无法读取,因为重定向是两次不同的请求,意味着 request 是两个不同的对象。



### 会话

为什么要有会话?

服务端可以接收若干个客户端请求,但是服务端无法识别每一次 HTTP 请求是从哪个客户端发送来的,它只会接收到一个请求信号。

所以需要一种技术来区分不同的客户端,这个技术就是会话。

会话:就是客户端和服务端之间发生的一系列连续的请求和响应的过程,打开浏览器进行操作到关闭浏览器的过程。

举例:会话就相当于打电话的过程,拿起电话拨通号码进行对话,直到挂掉电话的整个操作过程,就是一次会话。

会话状态指服务端和客户端在会话过程中产生的状态信息,借助于会话状态,服务端能够把属于同一次会话的一系列请求和响应过程关联起来。

实现会话机制有两种解决方案

- session
- cookie



服务端同时接收大量的客户端请求,如何来区分哪些请求来自于同一个会话?能识别出来自同一个客户端的访问请求,这就需要客户端对其发出的每个请求进行标识,属于同一个会话中的请求都有相同的标识号,这就是 sessionID。

session 常用方法:

- String getId()    //获取sessionID
- void setMaxInactiveInterval(int interval)     //设置 session 失效时间,单位是秒
- int getMacInactiveInterval()         //获取 session 时间

- void setAttribute(String key,Object value)      //在 session 中以键值对的形式存储数据
- Object getAttribute(String key)                  //通过 key 值获取 session 中保存的数据
- void removeAttribute(String key)           //通过 key 值移除 session 中保存的数据



实际开发中,普通的业务数据传递一般选择 request,需要结合转发完成资源的跳转。登录成功之后的用户信息,一般选择 session,无论是转发还是重定向,没有区别,都可以从 session 中取出数据。

69期-Java SE-045_JSP-2

index.jsp

<%@ page import="java.util.Map" %>
<%@ page import="java.util.Set" %>
<%@ page import="java.util.Arrays" %>
<%@ page import="java.util.Enumeration" %><%--
  Created by IntelliJ IDEA.
  User: southwind
  Date: 2019-07-07
  Time: 20:10
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
    <%
      String username = request.getParameter("username");
      String password = request.getParameter("password");
      if(username.equals("zhangsan")&&password.equals("123")){
          request.setAttribute("name",username);
//          response.sendRedirect("welcome.jsp");
        request.getRequestDispatcher("welcome.jsp").forward(request,response);
      }else{
          request.setAttribute("error","用户名或密码错误");
//          response.sendRedirect("login.jsp");
        request.getRequestDispatcher("login.jsp").forward(request,response);
      }
    %>
    <h1>index</h1>
  </body>
</html>

 

login.jsp

<%--
  Created by IntelliJ IDEA.
  User: southwind
  Date: 2019-07-07
  Time: 20:48
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        String error = (String) request.getAttribute("error");
        if(error!=null){
            out.write(error);
        }
    %>


    <form action="index.jsp">
        <table>
            <tr>
                <td>用户名:</td>
                <td>
                    <input type="text" name="username"/>
                </td>
                <td>密码:</td>
                <td>
                    <input type="password" name="password"/>
                </td>
                <td>
                    <input type="submit" value="登录"/>
                </td>
            </tr>
        </table>
    </form>
</body>
</html>

 

session.jsp

<%--
  Created by IntelliJ IDEA.
  User: southwind
  Date: 2019-07-07
  Time: 21:39
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        session.setAttribute("name","session");
        request.setAttribute("name","request");
        response.sendRedirect("test.jsp");
    %>
</body>
</html>

 

test.jsp

<%--
  Created by IntelliJ IDEA.
  User: southwind
  Date: 2019-07-07
  Time: 20:32
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>test</h1>
    <%
        String requestName = (String) request.getAttribute("name");
        String sessionName = (String) session.getAttribute("name");
    %>
    requestName<%=requestName%><br/>
    sessionName<%=sessionName%>
</body>
</html>

 

welcome.jsp

<%--
  Created by IntelliJ IDEA.
  User: southwind
  Date: 2019-07-07
  Time: 20:48
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        String name = (String) request.getAttribute("name");
    %>
    欢迎回来~!<%=name%>
</body>
</html>

69期-Java SE-045_JSP-2

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
</web-app>

 

上一篇:史上最全69道Spring面试题和答案


下一篇:[LeetCode] 69. x 的平方根