JSP
JSP简介
(表示层技术)
1.什么是JSP
sun公司制定的一种服务器端的动态页面技术规范(sun公司被Oracle公司收购了)
注:生成动态页面,只需要写一个以".jsp"为后缀名的文件,该文件会被容器自动转换成一个对应的Servlet然后执行。也就是说,JSP
本质就是一个Servlet
!
(可在tomcat的安装目录下查看work目录下的D:\JavaDevTools\apache-tomcat-9.0.30\work\Catalina\localhost\jspdemo\org\apache\jsp
)
2.如何写一个JSP?
1. 添加一个以.jsp
为后缀的文件
2. 在该文件里面,可以使用如下几个元素:
-
html(css,javascript)
直接写即可 -
java代码
-
方式一:java代码片段
<% java代码 %>
time:<% Date date = new Date(); out.print(date); %>
-
方式二:jsp表达式
<%= java表达式 %>
time:<%= new Date() %>
-
方式三:jsp声明
<%! 声明变量或者方法 %>
<%! String info = "您好"; %> <%= info> <%! int sum(int a,int b){ return a + b; } %> <%= sum(2,4) %> // 这个编译成.java文件就是一个成员变量或者方法,它不在service方法中!!!
-
-
隐含对象(内置对象)
-
什么是隐含对象?
直接可以使用的对象,比如out、request和response。 out = pageContext.getOut();
-
为什么可以直接使用这些隐含对象?
容器会自动添加获得这些对象的代码。
-
有哪些隐含对象?
session:HttpSession接口的实现,也就是session对象。 //javax.servlet.http.HttpSession session = null; //session = pageContext.getSession(); application:ServletContext接口的实现,也就是Servlet上下文。 //注:容器启动之后,会为每一个web应用(比如jspdemo)创建唯一的一个符合ServletContext接口要求的对象,该对象称之为Servlet上下文。该对象会一直存在,除非容器关闭或者应用被删除 //final javax.servlet.ServletContext application; // application = pageContext.getServletContext(); // 全局共享的,都可以访问 pageContext:PageContext接口的实现,也就是页面上下文 //注:容器会为每一个JSP实例创建唯一的一个符合PageContext接口要求的对象,该对象称之为页面上下文。该对象会一直存在,除非JSP实例被销毁。pageContext提供了一些用来获得其他所有的隐含对象的方法(用于JSP标签,JSP标签类可以通过该对象来访问到其他隐含对象) // 一个JSP实例对应一个pageContext(页面上下文) // pageContext会一直存在,除非JSP实例被删除 // 注:绑定到pageContext上的数据只有与之对应的jsp实例能够访问到。 config:ServletConfig接口的实现。 // 注:可以通过该对象读取初始化参数。 // final javax.servlet.ServletConfig config; // config = pageContext.getServletConfig(); exception:用来获得JSP运行时产生的异常信息的 // 注:只有当page指令的isErrorPage属性值为true时,才能使用该隐含对象 page(从来不用的,了解):JSP实例本身 注意:JSP实例指的是JSP对应的Servlet实例
-
示例:
示例:
```jsp
<%@ page contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head>
<title></title>
</head>
<body style="font-size:30px">
<!-- 隐藏对象session -->
sessionId: <%= session.getId() %>
<!-- 隐藏对象application -->
<%
application.setAttribute("username", "林龙");
%>
username:<%= application.getAttribute("username") %>
<!-- 隐藏对象config -->
<!-- 先在web.xml中配置servlet,然后就可以通过config.get方法来获取了
<servlet>
<servlet-name>test7</servlet-name>
<jsp-file>/test7.jsp</jsp-file>
<init-param>
<param-name>company</param-name>
<param-value>某公司</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>test7</servlet-name>
<url-pattern>/test.html</url-pattern>
</servlet-mapping> -->
公司名:<%= config.getInitParameter("company") %>
</body>
</html>
```
示例exception:
test8.jsp
```jsp
<%@ page contentType="text/html; charset=utf-8"
pageEncoding="utf-8" errorPage="test9.jsp" %>
<html>
<head>
<title></title>
</head>
<body style="font-size:30px">
<%
String number = request.getParameter("number");
int number1 = Integer.parseInt(number);
out.print(number1 * 2);
%>
</body>
</html>
```
test9.jsp
```jsp
<%@ page contentType="text/html; charset=utf-8"
pageEncoding="utf-8" isErrorPage="true" %>
<html>
<head>
<title></title>
</head>
<body style="font-size:30px">
请输入合法的数字!
<%= exception.getMessage() %>
</body>
</html>
```
-
指令
-
什么是指令?
通知容器,在将JSP转换成对应的Servlet时做一些额外的处理,比如导包。
-
语法格式
<%@ 指令名 属性=值 %>
-
page指令
import属性:用于指定要导的包名,比如:
<%@ page import="java.util.*"%> <%@ page import="java.util.* , java.text.*"%>
contentType属性:用于设置response.setContentType方法的 MIME类型。
pageEncoding属性:用于设置JSP文件的编码(保存在硬盘上)。
(如果不加的话,部分容器是默认使用ISO8859-1来编码)
<%@ page import="java.util.*" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
errorPage属性:指定一个异常处理页面。当JSP运行时发生了异常,则容器会调用异常处理页面来处理。
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8" errorPage="test9.jsp" %> <html> <head> <title></title> </head> <body style="font-size:30px"> <% String number = request.getParameter("number"); // 这里类型转换时会发生异常 int number1 = Integer.parseInt(number); out.print(number1 * 2); %> </body> </html>
isErrorPage属性:缺省值是false,当值为true时,表示这是一个异常处理页面。
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8" isErrorPage="true" %> <html> <head> <title></title> </head> <body style="font-size:30px"> 请输入合法的数字! <%= exception.getMessage() %> </body> </html>
-
3.JSP是如何执行的?
-
阶段一:容器将JSP转换成一个对应的Servlet。
a. html(css,js) --------> 在service方法里,使用out.write输出。 b. <% %> --------->照搬到service方法里面。 c. <%= %> --------->在service方法里,使用out.print输出。 d. <%! %>----------->添加新的成员变量或者方法
示例:
out.write("\r\n"); out.write("<html>\r\n"); out.write("\t<head></head>\r\n"); out.write("\t<body style=\"font-size:30px;\">\r\n"); out.write("\t\t加油!\r\n"); out.write("\t\ttime:"); out.print( new Date() ); out.write("\r\n"); out.write("\t\t<br />\r\n"); out.write("\t\ttime:"); Date date = new Date(); out.print(date); out.write("\r\n"); out.write("\t\t<br />\r\n"); out.write("\t\tHello JSP!\r\n"); out.write("\t\t"); for(int i=0;i<100;i++){ out.print("Hello JSP <br />"); }
-
阶段二:容器调用该Servlet。
注:容器会将这个Servlet进行编译,然后实例化、初始化,最后调用其方法(service方法)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WmabIu8H-1583583934952)(C:/Users/雪麟锋/Downloads/day02_all/a0.png)]
示例1:写一个Date.jsp,输出当前的系统日期,比如输出2020年02月22日
<%@ page import="java.util.*, java.text.*" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> <html> <head></head> <body style="font-size:30px;"> 系统当前时间是: <% Date now = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日"); String str = sdf.format(now); out.print(str); %> </body> </html>
示例2:写一个“用户列表”,即将用户表中的所有用户信息以表格的形式来展现。
<%@ page import="java.util.* ,dao.*, entity.*" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> <html> <head> <style> .row1{ background-color:#0f0; } .row2{ background-color:#f0f; } </style> </head> <body style="font-size:30px"> <table border="1" width="60%" cellpadding="0"> <tr> <td>ID</td> <td>姓名</td> <td>密码</td> <td>邮箱</td> </tr> <% UserDAO dao = new UserDAO(); List<User> users = dao.findAll(); for(int i=0;i<users.size();i++){ User user = users.get(i); %> <tr class="row<%= i%2+1%>"> <td><%= user.getId() %></td> <td><%= user.getUsername() %></td> <td><%= user.getPwd() %></td> <td><%= user.getEmail() %></td> </tr> <% } %> </table> </body> </html>
4.转发
-
什么是转发?
一个web组件将未完成的处理交给另外一个web组件继续做。
- web组件是Servlet和JSP的统称
- 常用的场景是Servlet获取数据之后转发给JSP,由JSP来展现
- 如何转发
step1.将数据绑订到request对象上。
request.setAttribute(String name,Object obj);
注:
绑订的本质就是map.put(name,obj);
Object request.getAttribute(String name);
step2.获得转发器。
RequestDispatcher rd = request.getRequestDispatcher(String uri);
注:
RequestDispatcher是一个接口,该方法会返回一个符合该接口要求的对象,我们称之为转发器。
uri是转发的地址,一般是一个JSP。
step3.转发
rd.forward(request,response);
-
转发与重定向的区别
-
能否共享request对象?
转发可以,而重定向不行。
注:容器收到请求之后,会立即创建request和response,当响应发送完毕,会立即销毁这两个对象。也就是说,request和response对象的生存时间是一次请求与响应期间存在。
-
浏览器地址栏的地址有无变化?
转发没有变化,而重定向有变化。
-
地址有无限制?
转发有限制,要求属于同一个web应用,而重定向没有任何限制。
-
一件事是否已经做完?
转发是一件事没有做完,让另外一个web组件继续做;而重定向是一件事已经完成,然后再做另外一件独立的事情。
-
上一篇: 一秒入门:不定宽高的水平垂直居中简单方式
下一篇: Jsp