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