JSP规范
1. JSP规范介绍
- 来源于JavaEE规范中一种
- JSP规范制定了如何开发JSP文件代替响应对象将处理结果写入到响应体的开发流程
- JSP规范制定了Http服务器应该如何调用管理JSP文件
- 优势:
- JSP文件在互联网通信过程,是响应对象的替代品
- 降低将处理结果写入到响应体的开发工作量同时降低处理结果的维护难度
- 在JSP文件开发时,可以直接将处理结果写入到JJSP文件而不需要手写
out.print
命令,在Http服务器调用JSP文件时,根据JSP规范要求自动的将JSP文件书写的所有内容通过输出流写入到响应体中。
2. 响应对象存在的弊端
- 适合将数据量较少的处理结果写入到响应体中
- 如果处理结果数量过多,使用响应对象增加开发难度
3. JSP文件内置对象request
-
类型:HttpServletRequest
-
作用:
- 在JSP文件运行时读取请求包信息
- 与Servlet在请求转发的过程中实现数据共享
-
栗子:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%--使用浏览器访问http://localhost:8080/myWeb/index.jsp?userName=陌言&password=0916--%> <% String userName = request.getParameter("userName"); String password = request.getParameter("password"); %> 1.用户名称:<%=userName%><br/> 2.用户密码:<%=password%>
-
在浏览器中打印出
-
用户名称:陌言
-
用户密码:0916
-
-
4. JSP文件内置对象session
-
类型:HttpSession
-
作用:JSP文件在运行时,可以通过session指向当前用户私人储物柜,添加共享数据,或者读取共享数据
-
栗子:
-
session_1.jsp存数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <% session.setAttribute("key1", 200); %>
-
session_2.jsp取数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%=session.getAttribute("key1")%>
-
5. JSP文件内置对象application
-
类型:ServletContext全局作用域对象
-
作用:同一个网站中的Servlet和JSP,都可以通过当前网站的全局作用域对象实现数据共享
-
栗子:
-
application.jsp向全局作用域对象中存数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <% application.setAttribute("key1", "300"); %>
-
OneServlet从全局作用域对象中取数据
public class OneServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext application = request.getServletContext(); String value = (String) application.getAttribute("key1"); System.out.println("value = " + value); } }
-
6. Servlet跟JSP的联合调用
-
Servlet跟JSP分工:
- Servlet:负责处理业务并得到处理结果——大厨
- JSP:不负责业务处理,主要任务将Servlet中处理结果写入到响应体——传菜员
-
Servlet跟JSP之间的调用关系
- Servlet工作完毕之后,一般通过请求转发方式向Tomcat申请调用JSP
-
Servlet与JSP之间如何实现数据共享
- Servlet将处理结果添加到[请求作用域对象]
- JSP文件在运行时从[请求作用域对象]得到处理结果
-
栗子:
-
OneServlet处理业务,模拟得到处理结果
public class OneServlet extends HttpServlet { // 处理业务,得到处理结果———查询学员信息 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Student s1 = new Student(10, "mike"); Student s2 = new Student(20, "alien"); List stuList = new ArrayList(); stuList.add(s1); stuList.add(s2); // 将处理结果添加到请求作用域对象中 request.setAttribute("key", stuList); // 通过请求转发方案,向Tomcat申请调用user_show.jsp // 同时将request与response通过tomcat交给user_show.jsp使用 request.getRequestDispatcher("/user_show.jsp").forward(request, response); } }
-
user_show.jsp负责将处理结果写入到响应体中
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <% // 从请求作用域对象得到OneServlet添加进去的集合 List<Student> stuList = (List) request.getAttribute("key"); %> <%--将处理结果写到响应体中--%> <table border="2" align="center"> <tr> <th>用户编号</th> <th>用户姓名</th> </tr> <% for (Student stu:stuList){ %> <tr> <td><%=stu.getSid()%></td> <td><%=stu.getSname()%></td> </tr> <% } %> </table>
-
7. JSP文件运行原理
-
Http服务器调用JSP文件步骤:
- Http服务器将JSP文件内容编辑为一个Servlet接口实现类(.java)
- Http服务器将Servlet接口实现类编译为class文件(.class)
- Http服务器负责创建这个class的实例对象,这个实例对象就是Servlet实例对象
- Http服务器通过对这个Servlet实例对象调用它的_jspService方法,将jsp文件内容写入到响应体中
-
Http服务器编辑与编译JSP文件的位置:[work]文件夹下
8. EL技术
-
介绍:由Java技术开发的一个jar包
-
作用:降低JSP文件开发时Java命令开发强度
-
Tomcat服务器本身自带了EL工具包(Tomcat安装地址/lib/el-api.jar),故而不需要我们导入。当我们在将网站交给Tomcat进行管理的时候,tomcat发现我们缺少这个jar包,会自动到自己的lib中去找对应的jar包。
-
EL表达式:
-
命令格式:
${作用域对象别名.共享数据名}
-
命令作用:
- EL表达式是EL工具包提供的一种特殊命令格式
- EL表达式在JSP文件上使用
- 负责在JSP文件上从作用域对象读取指定的共享数据并输出到响应体
-
作用域对象别名
-
JSP可以使用的作用域对象
- ServletContext application:全局作用域对象
- Httpsession session:会话作用域对象
- HttpServletRequest request:请求作用域对象
- PageContext pageContext:当前页作用域对象,这是JSP文件独有的作用域对象。Servlet中不存在。在当前页作用域对象存放的共享数据仅能在当前JSP文件中使用,不能共享给其他Servlet或者其他JSP文件使用。真实开发过程中,主要用于JSTL标签和JSP文件之间数据共享。JSTL——》pageContext——》JSP
-
EL表达式提供作用域对象别名
JSP 表达式 application ${applicationScope.共享数据名} session ${sessionScope.共享数据名} request ${requestScope.共享数据名} pageContext ${pageScope.共享数据名}
-
-
EL表达式将引用对象属性写入到响应体中
- 命令格式:
${作用域对象名.共享数据名.属性名}
- 命令作用:从作用域对象读取指定共享数据关联的引用对象的属性值。并自动将属性的结果写入到响应体。
- 属性名:一定要与引用类型属性名完全一致(大小写)
- 原理:反射机制
- 注意:EL表达式没有提供遍历集合方法,因此无法从作用域对象读取集合内容输出。
- 命令格式:
-
EL表达式简化版
- 命令格式:
${共享数据名}
- 命令作用:EL表达式允许开发人员开发时省略作用域对象别名
- 工作原理:EL表达式简化版由于没有指定作用域对象,在执行的时候采用猜的算法
- 首先到pageContext中定位,如果存在直接读取输出并结束执行
- 如果在pageContext没有定位成功,则开始依次到request、session、application中去定位。
- 存在隐患:
- 容易降低程序执行速度
- 应用场景:
- 设计目的,简化从pageContext读取共享数据并输出的难度。
- 命令格式:
-
支持运算表达式
-
前提:在JSP文件有时需要将读取共享数据进行一番运算之后,写入到响应体中。
-
栗子:
-
OneServlet提供数据
public class OneServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setAttribute("key1", "100"); request.setAttribute("key2", 200); request.getRequestDispatcher("/index_1.jsp").forward(request, response); } }
-
index_1.jsp读取共享数据并进行一番运算,然后将运算结果写入到响应体中
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%--将作用域对象中共享数据读取出来相加,将响应结果写入到响应体--%> <!--1. 传统做法--> <% Integer n1 = Integer.valueOf((String) request.getAttribute("key1")); Integer n2 = (Integer) request.getAttribute("key2"); int sum = n1 + n2; %> 计算后结果:<%=sum%><br/> EL表达式计算后结果:${key1 + key2} +号提醒EL表达式将字符串转为数字进行运算<br/> EL表达式输出关系运算:${30>20? "30大于20":"30小于20"}
-
-
运算表达式:
- 数学运算
- 关系运算(>、<、<=、 ==、 >=、 !=)
- 逻辑运算(&&、||、! )
-
-
EL表达式提供内置对象
-
命令格式:
${param.请求参数名}
-
命令作用:通过请求对象读取当前请求包中请求参数内容并将请求参数内容写到响应体
-
代替命令:
-
index.jsp(发送请求:
Http://localhost:8080/myWeb/index.jsp?userName=mike&&password=123
)<% String userName = request.getParameter("userName"); String password = request.getParameter("password"); %> <%=userName%> <%=password%>
-
-
命令格式:
${paramValues.请求参数名[下标]}
-
命令作用:如果浏览器发送的请求参数是[一个请求参数关联多个值],此时可以通过paramValues读取请求参数中指定位置的值并写入到响应体中
-
代替命令:
http://localhost:8080/myWeb/index_2.jsp?pagNo=1&pagNo=2
此时pagNo请求参数在请求包中以数组形式存在- pagNo:[1, 2]
<% String array[] = request.getParameterValues("pageNo"); %> 第一个值:<%=array[0]%> 第二个值:<%=array[1]%>
-
-
EL表达式常见异常:
-
org.apache.jasper.JasperException
在对象中没有找到指定的属性
-
琐碎知识
- jsp文件在执行的时候,自动地将文件所有内容写入到响应体中,从而节省书写out.print。
- 在JSP文件中直接书写Java命令(在执行标记
<%....内容..%>
中写Java命令),是不能被JSP文件识别,此时只会被当作字符串写入到响应体。 - 在JSP文件中,通过输出标记
<%=变量名%>
,通知JSP将Java变量的值写入到响应体中。 - 在JSP文件夹中,所有的执行标记当作一个整体。
- JSTL可以有效弥补EL表达式没法遍历集合的缺陷。
- MySQL中随机查询的功能
select * from table order by rand()
- 单纯
select rand()
返回的是0—1之间的小数 - 该随机查询功能是MySQL特有的,像Oracle等都没有。
- 单纯