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 中取出数据。

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>

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>

原文地址:https://www.cnblogs.com/HiJackykun/p/11182688.html

时间: 2024-08-30 11:16:17

69期-Java SE-045_JSP-2的相关文章

69期-Java SE-035_MySQL-6 存储过程、SQL练习 -doing

### 存储过程 存储过程是一组为了完成特定功能的 SQL 语句集合,经过编译后存储在数据库中,用户通过指定存储过程的名称以及参数来执行相应的存储过程. 一次编写,多次调用,避免开发人员重复编写相同的 SQL 语句,存储过程是在数据库中存储和执行的,可以减少客户端和服务端之间的数据传输,从而提高效率. ### 优点 - 模块化的程序设计,只需要创建一次存储过程,以后就可以在程序中调用该存储过程任意次. - 执行速度更快,如果某个操作需要执行大量的 SQL 语句或者需要重复执行 SQL 语句,存储

69期-Java SE-031_MySQL-001-002 创建表、MySQL数据类型、数据的管理(数据库结构、数据表、数据)、SQL 函数

### 创建表 1.创建数据库 ```sql create database mstest default character set utf8 collate utf8_general_ci ``` 2.创建数据表 ```sql create table user( id int, name varchar(11) ) ``` Java 数据类型:基本数据类型 byte short int long double float boolean char ? 引用类型 MySQL 数据类型 - 整

69期-Java SE-002_变量、运算符-001-002

- 声明变量的数据类型和变量名. - 给内存空间赋值,该值就是变量值. - 通过变量名使用变量. ```java public class Hello { public static void main(String[] args) { //1.开辟内存空间,定义变量名 int num1; //2.赋值 num1 = 10; //3.使用变量 System.out.println(num1); } } ``` ```java public class Hello { public static

69期-Java SE-003_流程控制、循环-001-002

### 位运算符 十进制和二进制的转换. - 十进制转二进制:目标数除以二,如果能除尽,则该位计作零,如果除不尽,则该位计作一,再对商继续除以二,以此类推,直到商为零,然后将每一位的结果进行反序组合就是对应的二进制结果,10 转为二进制 1010,17 转为二进制 10001 - 二进制转十进制:从目标数最右侧算起,本位的数值乘以本位的权重,权重就是2的第几位的位数减一次方,如果第1位就是2的(1-1)次方,第2位就是2的(2-1)次方,第3位就是2的(3-1)次方…,将每一位的数值和本位权重相

69期-Java SE-004_循环、数组-001-002

Hello.java import java.util.Scanner; public class Hello { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String str = "yes"; int num; while(str.equals("yes")) { System.out.print("请输入学生编号:")

69期-Java SE-036_MySQL-7 SQL练习 -doing

第一道: 现有图书管理数据库的三个关系模式,他们的字段分别如下: 图书表:总编号, 分类号, 书名, 作者, 出版单位, 单价 读者表:借书证号, 单位, 姓名, 性别, 职称, 地址 借阅表:借书证号, 总编号, 借书日期 以上表对应的字段明细如下: book : b_no ,b_type ,b_name , b_author ,b_publish ,b_price reader : r_no , r_unit , r_name ,r_sex ,r_pro ,r_address borrow

69期-Java SE-005_二维数组、综合练习-001-002

Test.java public class Test { public static void main(String[] args) { int[] array = {73,80,62,93,96,87}; //求最大值 int max = array[0]; for(int i=1;i<array.length;i++) { if(array[i]>max) { max = array[i]; } } System.out.println("数组中的最大值是"+max

69期-Java SE-007_面向对象-1-001-002

Student.java public class Student { //定义属性 int id; String name; int age; int userFirstName; double myScore; //定义方法 public static int add(int num1,int num2) { return num1+num2; } public static void add2(int num1,int num2) { System.out.println(num1+num

69期-Java SE-009_面向对象-3-001-002

### 多态 一个事物有多种表现形态. - 定义方法时形参为父类,调用方法时传入的参数为子类对象. - 定义方法时返回值数据类型为父类,调用方法时返回子类对象. 具有继承关系的两个对象可以相互转换,子类转父类即父类引用指向子类对象,可以自动完成,无需强制转换,也叫做向上转型. 父类转子类即子类引用指向父类对象,不能自动完成转换,需要强制转换,也叫做向下转型. ### 抽象方法和抽象类型 如果一个方法只有方法声明而没有具体的方法实现,那么该方法就是抽象方法,在方法定义处使用 abstract 关键

69期-Java SE-008_面向对象-2-001-002

User.java public class User { public static String name; public static int num; static { num++; System.out.println("执行了静态代码块"); } static { System.out.println("static2"); } } Cashier.java package entity; public class Cashier { private M