浩浩学编程JavaWeb-02JSP

    科技2026-01-21  11

    jsp

    目录

    jsp1.jsp定义2.jsp 9个内置对象3.jsp中的转发4.jsp重定向5.HTTP 请求状态码

    1.jsp定义

    JSP 本质上就是⼀个 Servlet,JSP 主要负责与⽤户交互,将最终的界⾯呈现给⽤户, HTML+JS+CSS+Java 的混合⽂件。 当服务器接收到⼀个后缀是 jsp 的请求时,将该请求交给 JSP 引擎去处理,每⼀个 JSP ⻚⾯第⼀次被访 问的时候,JSP 引擎会将它翻译成⼀个 Servlet ⽂件,再由 Web 容器调⽤ Servlet 完成响应。 单纯从开发的⻆度看,JSP 就是在 HTML 中嵌⼊ Java 程序。 具体的嵌⼊⽅式有 3 种:

    JSP 脚本,执⾏ Java 逻辑代码 <%=Java变量 %>

    JSP 声明:定义 Java ⽅法

    <%! 声明 Java ⽅法 %>

    JSP 表达式:把 Java 对象直接输出到 HTML ⻚⾯中

    <%=Java变量 %> <%-- Created by IntelliJ IDEA. User: haoqi Date: 2020/10/5 Time: 8:28 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>hello Index</h1> <%-- 在jsp中嵌入Java代码--%> <%! public String test(){return "hello java server page";}%> <% String str = test();%> <%= str%> </body> </html>

    <%@ page import="java.util.List" %> <%@ page import="java.util.ArrayList" %><%-- Created by IntelliJ IDEA. User: haoqi Date: 2020/10/5 Time: 21:42 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>jsp输出一个表格</title> </head> <body> <% List<String> names = new ArrayList<>(); names.add("haoqi"); names.add("safei"); names.add("xuchao"); names.add("wuzhen"); List<Integer> ages = new ArrayList<>(); ages.add(19); ages.add(18); ages.add(10); ages.add(22); %> <table border="1"> <tr> <th>姓名</th> <th>年龄</th> </tr> <!--方法一:直接挨个输出 <tr> <td><%=names.get(0)%></td> <td><%=ages.get(0)%></td> </tr> --> <!--用Java里面的for循环结构--> <%for (int i=0;i<names.size();i++){%> <tr> <td><%=names.get(i)%></td> <td><%=ages.get(i)%></td> </tr> <%}%> </table> </body> </html>

    2.jsp 9个内置对象

    request : HttpServletRequest 一次请求response : HttpServletResponse 一次响应pageContext :页面上下文,获取页面信息,session : 一次会话,保存用户信息 HttpSessionapplication :当前web应用,全局对象,保存所有用户共享信息,ServletContextconfig :当前 jsp 对应Servlet 的ServletConfig 对象 ,获取当前Servlet 的信息/out : 向浏览器输出数据jspWriterpage : 当前 jsp 对应Servlet 对象,servletexception : jsp 页面发生异常

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

    request 常方法

    String getParameter(String key) 获取客户端传来的参数void setAttribute(String key,Object value) 通过键值对的形式保存数据。Object getAttribute(String key) 通过 key 取出 value。RequestDispatcher getRequestDispatcher(String path) 返回⼀个 RequestDispatcher 对象,该对 象的 forward ⽅法⽤于请求转发。、String[] getParameterValues() 获取客户端传来的多个同名参数。、void setCharacterEncoding(String charset) 指定每个请求的编码。

    3.jsp中的转发

    jsp01.jsp

    <%@ page import="com.sun.corba.se.impl.encoding.IDLJavaSerializationInputStream" %><%-- Created by IntelliJ IDEA. User: haoqi Date: 2020/10/6 Time: 8:09 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=GBK" language="java" %> <html> <head> <title>Title</title> </head> <body> <% String idStr=request.getParameter("id");//地址栏后面加 ?id=123 Integer id=Integer.parseInt(idStr); id++; //将数据存入到request中 request.setAttribute("number",id); //将请求转发给test2.jsp request.getRequestDispatcher("jsp02.jsp").forward(request,response); %> <h1>jsp01.jsp</h1> <%=id%> </body> </html>

    jsp02.jsp

    <%-- Created by IntelliJ IDEA. User: haoqi Date: 2020/10/6 Time: 8:14 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> <% Integer number=(Integer) request.getAttribute("number"); %> <h1>jsp02.jsp</h1> <%=number%> </body> </html>

    注意 :地址栏仍然为 jsp01.jsp 但在jsp01.jsp的内部已经实现跳转到了 jsp02.jsp

    4.jsp重定向

    jsp03.jsp

    <body> <% request.setAttribute("name","Tom"); request.getRequestDispatcher("jsp04.jsp").forward(request,response); // response.sendRedirect("jsp04.jsp");//用这种方法并不能传递数据 %> </body>

    jsp04.jsp

    <body> <h1>jsp04.jsp</h1> <% String name=(String)request.getAttribute("name"); out.write(name); %> <!--能够正常跳转,但并不能正常显示out.write()会报空指针异常 --> </body>

    5.HTTP 请求状态码

    200:正常404:资源找不到400:请求类型不匹配500:Java 程序抛出异常

    转发 getRequestDispatcher 和 重定向 sendRedirect 的区别

    转发:将同一个请求转发给下一个页面重定向:由客户端发送⼀次新的请求来访问跳转后的⽬标资源,地址栏改变,也叫客户端跳转。如果两个⻚⾯之间需要通过 request 来传值,则必须使⽤转发,不能使⽤重定向

    **案例:**实现⽤户登录,如果⽤户名和密码正确,则跳转到⾸⻚(转发)并且展示⽤户名,否则重新回到登陆⻚⾯(重定向)。

    login01.jsp

    <%-- Created by IntelliJ IDEA. User: haoqi Date: 2020/10/6 Time: 9:29 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登录界面</title> </head> <form action="/login02.jsp" method="post"> <table> <tr> <td>用户: </td> <td><input type="text" name="username"/></td> </tr> <tr> <td>密码:</td> <td><input type="password" name="password"></td> </tr> <tr> <td><input type="submit" value="登录"></td> <td><input type="reset" value="重置"></td> </tr> </table> </form> </html>

    login02.jsp

    <%-- Created by IntelliJ IDEA. User: haoqi Date: 2020/10/6 Time: 9:29 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>接入</title> </head> <body> <% String username=request.getParameter("username"); String password=request.getParameter("password"); //假设用户名为 admin 密码为123456 if(username.equals("admin")&& password.equals("123456")){ //登录成功 request.setAttribute("name",username); request.getRequestDispatcher("login03.jsp").forward(request,response); }else //登录失败//用转发和重定向都可以 response.sendRedirect("login01.jsp"); %> </body> </html>

    login03.jsp

    <%-- Created by IntelliJ IDEA. User: haoqi Date: 2020/10/6 Time: 9:38 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>welcome</title> </head> <body> <% String name = (String) request.getAttribute("name"); %> 欢迎回来!<%=name%> </body> </html>

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d9uyQMh5-1602158795875)(C:\Users\haoqi\AppData\Roaming\Typora\typora-user-images\image-20201006100723614.png)]

    登录成功

    Processed: 0.013, SQL: 9