jsp
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 : 一次会话,保存用户信息 HttpSession
- application :当前web应用,全局对象,保存所有用户共享信息,ServletContext
- config :当前 jsp 对应Servlet 的ServletConfig 对象 ,获取当前Servlet 的信息/
- out : 向浏览器输出数据jspWriter
- page : 当前 jsp 对应Servlet 对象,servlet
- exception : 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)]
登录成功