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>常用的 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) 指定每个请求的编码。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
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>转发 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)]
登录成功
