首页 > 代码库 > jsp初识、servlet转发、转发与重定向的比较

jsp初识、servlet转发、转发与重定向的比较

jsp

sun公司制定的一种服务器端动态页面技术规范
生成动态页面
jsp其实是一个以.jsp为后缀的文件,该文件的内容主要是html和少量的java代码
容器会将jsp文件自动转换成一个servlet然后执行。

如何写一个jsp文件
1、创建一个以.jsp为后缀的文件
2、在文件里面添加如下的内容:
(1)html(css,js):直接写。不用写out.print
(2)java代码:
a、java代码片段 <% java语句; %>
b、jsp表达式
<%= java表达式%>
在 service方法里,使用out.print(java表达式)输出
(3)隐含对象
在jsp文件里面,可以直接使用的对象,比如 out,request,response
为什么可以直接使用这些隐含对象。
容器会自动生成获得这些对象的代码
但是容器在默认情况下只会默认导入servlet的几个包,要是想用其他的包,就要用到指令

指令:
通知容器在将jsp文件转换成servlet类时,做一些额外的处理,比如导包。
指令的语法:
<%@指令名称 属性=属性值 %>
a、import属性:导包
比如: <%@page import=”java.util.*”%>
要导多个包,可以用逗号隔开

代码
hello.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>hello</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="http://www.mamicode.com/styles.css">
    -->

  </head>

  <body>
        date:
  <%

        Date date = new Date();
        out.print("date:"+date);    
   %>

  <br>

    <%
        for(int i=0;i<10;i++){
            out.print("hello,Recar<br>");
        }
     %>

  </body>

</html>

技术分享

或者这么写

current time:<%= new Date() %><br>

就是写个等于 后面就等于把等于后面的语句写在out.print里
叫做表达式
不是一个语句。所以最后都没有写分号

创建jsp文件在webroot下。正常写html。要写java的时候外面套个<%%>就可以了
输出的话还是 out.print( )
容器会帮我们把jsp转换成servlet类~
对于jsp中html用out.write
对于java代码直接照搬
然后容器调用servlet
这里的可以直接用out,因为他会在转成servlet的时候会帮你定义 out
当然也可以直接用request和response
这些个就叫做隐含对象

输出中文

就是这句话

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

最后一个属性就是编码,我设置的是utf-8,不然默认是iso
pageEncoding属性:告诉容器jsp文件的编码。有些容器,在读取jsp文件的内容时,默认为按照iso-8859-1去解码,如果jsp文件里面包含了中文,会出现乱码

可以用标签来引入css文件

让一个servlet处理多种请求

1、后缀匹配 *.do
2、分析请求资源路径
String uri = request.getRequestURI() 这个就是获取请求资源路径
可以把uri.substring()来截取字uri来分析请求资源路径
比如第最后一个/最后一个.中间的

转发

一个web组件(servlet/jsp)将未完成的处理交给另外一个web组件继续做。
比如,一个servlet将处理结果转发给一个jsp来展现



如何转发:
1、绑定数据(处理结果)到requestrequest.setAttribute(String name ,Object obj)
根据绑定名获得绑定值
Object request.getAttribute(String name)
2、获得转发器
RequestDispatcher rd = request.getRequestDispatcher(String uri);
uri: 转发的地址。

3、转发:
rd.forward(request,response)

实例:
在emplist servlet中把out.print都删了加上转发,让其查询出来的List转发到jsp中。让jsp作为显示

                EmployeeDAO dao = new EmployeeDAO();
                    List<Employee> employees = dao.findAll();
                //使用转发,将处理转交给emplist.jsp
                //1、绑定数据
                    request.setAttribute("emplist", employees);
                //2、获得转发器.转发的目的地
                    RequestDispatcher rd = request.getRequestDispatcher("emplist.jsp");
                //3、转发
                    rd.forward(request, response);

jsp就直接获取就可以了。但是要注意转换类型。
还有名字要写对!!!

 <%
            List<Employee> employees = (List<Employee>) request.getAttribute("emplist");
            for(int i=0;i<employees.size();i++){
            Employee e = employees.get(i);
            %>

最后访问的是 emplist !!!!不是emplist.jsp
因为是访问emplist,然后查询出来的employees转发到emplist.jsp 然后用jsp把查询的显示出来。
技术分享

转发的特点:

a、转发之后,浏览器地址栏的地址不变。
b、转发地址有限制(必须是同一个应用)

include指令

告诉容器,在将jsp文件转换成servlet类时,将file属性指定的文件的内容插入到该指令所在的位置
比如: <%@include file=”heard.jsp”%>
可以分开写,方便更改

取消浏览器的默认行为,就是说,一般连接,点击了或者表单点击提交,浏览器都会处理。但是加个 onclick=”return false”就会禁止了。无论怎么点都没用
如果写 return confirm(‘是否确定删除,取消就相当于false,确定就是true’)

<a href="del?id=<%=e.getId() %> " onclick="return confirm(‘是否确定删除<%=e.getName() %>‘)" >删除</a>

技术分享

jsp只是用来展示
servlet来处理,把处理得到的数据转发给jsp 就用到转发。
然后用到jsp的标签等

处理servlet运行时产生的异常

1、编程式处理
a)捕获异常
b)转发给一个jsp
比如:

request.setAttribute(“error_msg”,”系统繁忙,稍后重试”);
request.getRequestDispatcher(“error.jsp”).forward(request,response);

2、声明式处理(即交给容器来处理)
a)捕获异常,然后抛出异常给容器
b)配置处理页面

<error-page>
<exception-type> 异常类型</exception-type>
<location>显示的异常页面</location>
</error-page>

技术分享

声明式异常常用来处理系统异常(异常发送之后不能恢复,比如数据库服务停止)。发生这类异常之后,提示用户稍后重试即可

编程式异常(转发的方式)更灵活,可以用来处理应用异常(比如用户输入错误的密码等。)

可以把所有servlet放在一个里面
创建servlet
然后对请求资源路径进行判断做不同的操作,就把之前写的servlet对应的每个判断下写。

转发与重定向的比较

1、转发所涉及的各个web组件可以共享同一个rquest对象,重定向不可以
容器收到请求之后会创建请求对象和响应对象,当响应发送完毕,容器会立即删除request对象和response对象。也就是request对象和response对象的生存时间是一次请求和响应期间
重定向是两次请求
2、重定向之后,浏览器地址栏的地址会变;转发不变。
3、重定向地址是任意的,而转发地址必须是同一个应用
4、转发是一件事未完成,而重定向是一件事已经完成。

路径问题

连接地址,表单提交地址,重定向,转发这四种情况下,如果填写路径。

<a href =””></a>
<form action=””>
request.sendRedirect(“”);
request.getRequestDispatcher(“”);

(1)相对路径
不以”/”开头的路径
(2)绝对路径
以”/”开头的路径
(3)如何去写绝对路径
链接地址,表单提交地址,重定向从应用名开始写;
转发从应用名之后开始写

最好写绝对路径

String request.getContextPatch();

来获得实际部署时的应用名

也就是说写绝对路径的时候,写 request.getContextPatch(); 就可以当应用名了。
因为有可能会改变应用名

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

    jsp初识、servlet转发、转发与重定向的比较