JSP及Java中转发和重定向的概念

jsp小脚本:
.语法规则:<%......%>
.语法内容:能够写在方法里的java代码片段都可以作为小脚本
.转译成Servlet时的规则:原封不动成为Servlet类的service()方法里面的一段代码

jsp声明
.语法规则:<%!....%>
.合法内容:成员属性或成员方法的声明
.转译成Servlet时的规则:成为JSP页面转译成的Servlet类中成员属性或成员方法

<%!
    public String getResult(){
    //......
    }
%>
转译:将代码整体插入到Servlet类中
public String getResult(){
    //......
    }
public void service(){

}

jsp页面中的指令:
.语法规则:<%@指令名 属性=值%>
.常用指令:
-page指令:
-include指令:
-taglib指令:
.作用:
控制jsp在转译成Servlet类时生成的内容

page指令:用于导包,设置页面属性.
.例如:<%@page import="java.util.*" %>
<%@page import="java.util.*,java.sql.*" %>

<%@ page contentType="word/txt;"%>
设置当前页面被浏览器打开时的默认格式.

<%@ page pageEncoding = "ISO-8859-1" %>
设置容器读取该文件时的解码格式,这也就是为什么web服务器默认按照ISO-8859-1解码的原因.

include指令:
作用:在jsp页面替换成Servlet时,能够将其他文件包含进来,可以包含jsp文件也可以是静态的
HTML文件.
.通过该语句能方便的在每个jsp页面中包含导航栏,版权声明和logo等.

语法:
<%@ include file = "URL" %>
例如:
<%@ include file = "index.jsp" %>

JSP页面中的隐含对象.
什么是隐含对象?
-容器自动创建,在jsp文件中可以直接使用的对象
.作用
-JSP预先创建的这些对象可以简化对Http请求,响应信息的访问等.

隐含对象
输入输出对象:request,response,out
作用域通信对象:session,application,pageContext
Servlet对象:page,config
异常对象:exception

request         HttpServletRequest        请求信息
response         HttpServletResponse     响应信息
out                JSPWrite                输出的数据流
session            HttpSession                会话    
application        ServletContext            全局的上下文对象
pageContext        pageContext                jsp上下文对象
page            Object                    jsp页面本身
config            ServletConfig            Servlet配置参数
exception        Throwable                抓捕网页异常

转发
什么是转发:
.一个web组件(servlet/jsp)将未完成的处理通过容器转交给另外一个web组件继续完成
.常见情况:
一个Servlet获得数据之后(比如通过调用dao),将这些数据转发给一个JSP,由这个JSP来
展现这些数据(比如:以表格的方式来展现)

如何实现转发:
1.绑定数据到request对象
2.获取转发器
3.转发

request.setAttribute("list",list);
request.getRequestDispatcher("text.jsp").forward(request,response);

如何实现绑定:
request.setAttribute(String name,Object obj)
读取绑定值
Object request.getAttribute(String name);
如果绑定名对应的值不存在,返回null

获得转发器:
RequestDispatcher rd = request.getRequestDispatcher("String path");
path:转发的目的地,即将未完成的处理继续下去的另外一个组件,比如说JSP.

转发
.实现转发rd.forward(request,response)
通常情况第二步和第三部合并为一行语句

转发的特点:
.转发之后,地址栏地址不会发生变化,原因是转发的过程是发生在服务器内部的,浏览器
并不知道
.转发的目的地必须是同一个应用内部的某个地址
.转发所涉及的各个web组件会共享一个request和reponse对象.

思考:
1.重定向语句之后再写语句会报异常
所有转发之后再写语句是否会报出异常,还是正常执行.

正常执行,只要代码不出异常就行.

2.编写程序查询t_emp表中的数据,封装成对象,使用转发将数据传递到下一个页面遍历
数据进行展示.

转发和重定向的区别:
.重定向是浏览器发送请求并受到响应以后再次向一个新地址发送请求,转发是服务器收到
请求后为了完成响应转到一个新地址.
.重定向中有两次请求对象,不共享数据,转发只产生一此请求对象且在组件间共享数据
.重定向地址栏地址发生改变,而转发不会
.重定向的新地址可以是任意地址,转发到新地址必须是同一个应用内的某地址

异常处理:
编程式处理
try{

}catch(Exception e){
//转发到错误页面
request.getRequestDispatcher("text.jsp").forward(request,response);
}

容器中声明式处理:
1.将异常抛给容器,但是底层的错误提示不要返回给用户
ps:异常只允许抛service指定的异常,不能超出其范围
-使用如下写法:throw new ServletException(e)

2.在web.xml文件中配置错误处理页面
<error-page>
    <exception-type>
        javax.servlet.ServletException
    </exception-type>
    <location>/error.jsp</location>
</error-page>


Writer writer = new StringWriter();
             e.printStackTrace(new PrintWriter(writer));  
            // TODO Auto-generated catch block
request.setAttribute("err", "系统错误请重试"+writer.toString().substring(0,100));


 

猜你喜欢

转载自blog.csdn.net/CXY_ZPH/article/details/84993926