1 JSP的由来
1.1 为什么有JSP规范
Servlet技术产生以后,在使用时最麻烦的是使用大量的out.print语句输出页面。这样的形式在系统变更、维护、预览效果时都不能方便快捷的完成任务,于是推出JSP这种技术,用来将Servlet中负责显示的语句抽取出来。
class xxxServlet{
...service(){
...
out.println("<html>");
...
out.println("</html>");
...
}
1.2什么是JSP
Sun公司制定的一种服务器端动态页面技术的组件规范。
JSP是一个以“. jsp”为后缀的文件,在该文件中,主要是HTML和少量的Java代码。JSP文件会被容器转换成一个Servlet类,然后执行。
< html>
<head></head>
<body>
<table>
java代码...
</table>
java代码...
</body>
</html>
2. JSP编写规范
2.1 如何编写JSP
step1:写一个以” .jsp”为后缀的文件
step2:在该文件中可以包含如下内容:
- HTML(CSS、JavaScript)
- 注释
- Java代码
- 指令
- 隐含对象
2.2 JSP页面中的HTML 代码
作用:控制页面在浏览器中显示的效果
转译成Servlet时的规则:成为Servlet中的service()方法的out.write语句
2.3 JSP页面中的注释
语法:
1)<!-- 注释内容 -->
HTML注释,注释中的内容如果包含Java代码,这些Java代码,会被忽略
2)<%-- 注释内容 --%>
JSP特有的注释,如果注释的内容中出现Java代码,会被忽略
2.4 JSP页面中的Java代码
JSP页面中的Java代码,包含以下三种:
- JSP表达式
- JSP小脚本
- JSP声明
编写位置:页面的任意位置
作用:控制页面中可变内容的产生
2.5 JSP表达式
语法规则:<%= ... ... %>
合法内容:
变量、变量加运算符组合的表达式、有返回值的方法
转译成Servlet时的规则:
在service( )
方法中用out.print
语句输出该变量、表达式、方法的值
Eg:
<p>The square root of 5 is <%=Math.sqrt(5)%></p>
转换成
out.write("<p>The square root of 5 is ");
out.write(Math.sqrt(5));
out.write("</p>");
2.6 JSP小脚本
语法规则:<% ... ... %>
合法内容:能够写在方法里的Java代码片段都可以作为小脚本
转移成Servlet时的规则:原封不动成为Servlet类的service( )方法里面的一段代码
Eg:
<%
String name = request.getParameter("name");
if(name!=null && !name.equals("")){
%>
<p>Your name is <%=name %></p>
<%
}
%>
转换成如下代码插入到service方法中
String name = request.getParameter("name");
if(name!=null && !name.equals("")){
out.write("<p>Your name is");
out.print(name);
out.write("</p>");
2.7 JSP声明
语法声明:<%! ... ... %>
合法内容:成员属性或成员方法的声明
转译成Servlet时的规则:成为JSP页面转译成的Servlet类中成员属性或成员方法
Eg:
<%!
public String getResult(){
//...
}
%>
将代码整体插入到Servlet类中
public class Index_JSP extends JSPBase{
public String getResult(){
//...
}
public void service()...
}
2.8 JSP页面中的指令
语法规则:<% @指令名 属性=值 %>
常用指令:
- page指令
- include指令
- taglib指令
作用:控制JSP 在转译成Servlet类时生成的内容
2.9 page指令
作用:用于导包、设置页面属性
Eg:
<%-- 导包 -->
<%@ page import="java.util.*" %>
<%@ page import="java.util.*,java.sql.*" %>
<%-- 设置response.setContentType()方法的参数值 -->
<%@ page contentType = "image/gif" %>
<%-- 设置容器读取该文件时的解码 -->
<%@ page pageEncoding="UTF-8" %>
2.10 include指令
作用:在JSP页面转换成Servlet时,能够将其他文件包含进来,可以包含JSP文件也可以是静态的HTML文件。
通过该语句能方便的在每一个JSP页面中包含导航栏、版权声明、logo等
语法:
<%@ include file = "url" %>
Eg:
<%@include file = "header.html" %>
<%@include file = "footer.html" %>
2.11 JSP页面中的隐含对象
什么是隐含对象?
容器自动创建,在JSP文件中可以直接使用的对象
作用:JSP预先创建的这些对象可以简化对HTTP请求,响应信息的访问
3. JSP运行原理
3. 1 JSP是如何运行的
3. 2 JSP是如何转换成Java
3. 3 如何将静态页面转化成动态页面
step1:拷贝静态页面代码到JSP页面
step2:添加page指令pageEncoding和contentType
step3:修改页面内容与目标内容一致
step4:将需要动态生成的内容删除,替换为Java代码
4. 转发
4. 1 什么是转发
一个Web组件(Servlet/JSP)将未完成的处理通过容器转交给另一个Web组件继续完成
常见问题:一个Servlet获得数据之后(比如通过调用dao),将这些数据转发给一个JSP,由这个JSP来展现这些数据(比如,以表格的方式来展示)
4. 2 如何实现转发
- 1)绑定数据到request对象
- 2)获得转发器
- 3)转发
4. 3 绑定数据到request对象
实现绑定
request.setAttribute(String name,Object obj);
name : 绑定名
obj : 绑定值
读取绑定值
Object request.getAttribute(String name)
如果绑定名对应的值不存在,返回null
4. 4 获得转发器
RequestDispatcher rd = request.getRequestDispatcher(String path);
path:转发的目的地,即将未完成的处理继续下去的另一个组件,比如一个JSP文件
4. 5 转发
实现转发:rd.forward(request,response);
通常情况下第2步和第3步合并为一行语句,如下:
request.getRequestDispatcher(path).forword(request,response);
4. 6 转发的原理
4. 7 转发的特点
转发以后,地址栏不会发生变化。原因是转发的过程是发生在服务器内部的,浏览器并不知道。
转发的目的地必须是同一个应用内部的某个地址
转发所涉及的各个web组件会共享同一个request对象和response对象
注意:在forward之后的其他语句还会执行吗?
答:一定会执行,只要不报异常。
4. 8 转发和重定向的区别
重定向是浏览器发送请求并收到响应以后再次向一个新地址发请求;转发是服务器收到请求后为了完成响应收到新的地址
重新定向中有两次请求对象,不共享数据,转发只产生一次请求对象且在组件间共享数据
重定向后地址栏地址改变,而转发则不会
重定向的新地址可以是任意地址,转发到的新地址必须是同一个应用内的某地址
5 JSP开发常见问题
5.1 异常处理
1)编程式的异常处理
使用转发跳转到指定页面进行提示说明
try{
//... ...
}catch(Exception e){
request.getRequestDispatcher(url).forward(request,response);
2)容器中的声明式处理
step1:将异常抛给容器,但底层的错误提示不要返回给用户
注意:异常只允许抛service指定的异常,不能超出指定范围
使用如下写法:
throw new ServletException(e);
step2:在web.xml文件中配置错误处理页面节点
<!--配置错误处理页面-->
<error-page>
<exception-type>
java.servlet.ServletException
</exception-type>
<location>/error.jsp</location>
</error-page>
5.2 路径问题
1)路径使用
链接地址
<a href= "url" ></a>
表单提交
<form action = "url" >
重定向
response.sendRedirect(url)
转发
request.getRequestDispatcher(url)
2)相对路径
从当前文件出发到达目标文件所经过的路径叫做相对路径
书写格式不以“ / ”开头
退至上一级目录以“ . . / ”开头
3)绝对路径
以 ” / ” 开头的路径都是绝对路径,不以当前文件的位置作为起- 始,而是以一个固定位置作为起始到达目标文件所经过的路径
这个固定的位置可能是应用名,也可能是应用名之后
4)路径的处理技巧
在使用绝对路径时:
链接地址、表单提交、重定向是从应用名开始写
转发 是从应用名之后开始写
获得应用的实际部署名称可使用如下方法:
String request.getContextPath();