<%@include%>、<jsp:include>、<jsp:forward>、sendredirect

1、include指令
    作用:把多个文件中需要共享的代码放在单独的文件中,然后在需要的时候使用该指令引入这个文件。典型的应用,把网站的头部和版权信息放在单独的文件中,在其他文件中包含这两部分。
    基本的语法格式:
        <%@ include file="目标文件"%>
    file属性指出目标文件。
    例:把index.jsp和register.jsp中的共同部分做成单独的文件header.jsp(后缀名不一定是.jsp),然后在index.jsp和register.jsp中调用。
    header.jsp中的内容如下:

<%@ page contentType="text/html;charset=gb2312"%>
<table  align="center" width=780>
   <tr height="100">
      <td align="center"><h1>电子书店</h1></td>
   </tr>
   <tr>
      <td align="center">
         <!-- 超链接的基本格式  -->
         <a href="register.jsp">注册</a>
         最新图书 最畅销图书 查询图书 修改密码 查询订单 购物车</td>
   </tr>
   <tr>
      <td><hr></td>
   </tr>

在index.jsp中引入header.jsp的代码:
<%@ page contentType="text/html;charset=gb2312"%>

<%@ include file="header.jsp"%>

   <tr>
      <td>
         <table>
             <tr>
                 <td>
                     <!--登录界面代码-->
                     <form action="login_process.jsp" method="post">
                        <!-- 主要是涉及提交信息,就要用到form,action决定了提交给哪个文件处理 -->
                        用户名:<input type="text" name="username" value="aaa"> <br>
                        口令:<input type="password" name="userpass" value=""> <br>
                        <input type="submit" value="登录"><input type="reset" value="重写">
                     </form>
                 </td>
                 <td>
                      欢迎光临我们的书店!
                 </td>
             </tr>
         </table>
      </td>
   </tr>
</table>
 
运行过程:在转换的时候,当遇到include指令的时候会把include指令指向的目标文件的内容拷贝到当前位置,替换include指令,这样最后形成一个文件。然后才编译形成class文件,然后运行。

2、<jsp:forward>标签

   我们使用登录功能的模拟来介绍。
   首先,使用Java代码完成判断,使用<jsp:forward>完成跳转,代码:
<%@ page contentType="text/html;charset=gb2312"%>

<%
   // 先获取用户输入的用户名和口令,然后判断是否合法
   String username = request.getParameter("username");

   String userpass = request.getParameter("userpass");

   if(username.equals("zhangsan") && userpass.equals("zhangsan"))
   {
%>

       <jsp:forward page="success.jsp"/>
<%
   }else{
%>
       <jsp:forward page="index.jsp"/>
<%
   }
%>

   注意:不管跳转到success.jsp还是index.jsp,地址栏都是处理文件的名字。
   <jsp:forward>的语法格式:
       <jsp:forward page="目标文件"/>
   page属性指出转向的目标文件。最后的结束符为“/>”,斜杠不能省略。

   另外一个可以完成跳转的方式是采用response.sendRedirect()。response和request一样,都是内容对象,可以直接访问。修改上面的文件:
<%@ page contentType="text/html;charset=gb2312"%>

<%
   // 先获取用户输入的用户名和口令,然后判断是否合法
   String username = request.getParameter("username");

   String userpass = request.getParameter("userpass");

   if(username.equals("zhangsan") && userpass.equals("zhangsan"))
   {
       response.sendRedirect("success.jsp");
   }else{
       response.sendRedirect("index.jsp");
   }
%>

   <jsp:forward>和response.sendRedirect的运行效果相同(针对上面的这个例子)。
   相同点:都是转向目标文件。
   不同点:地址栏中显示的内容是不相同的,如果使用<jsp:forward>,地址栏显示当前文件的名字,如果使用response,地址栏显示的是转向后的文件的名字。执行过程不同:使用<jsp:forward>相当于一次请求,使用response相当于两次请求。
   使用<jsp:forward>的情况:
   index.jsp中输入用户名和口令,提交给login_process.jsp,服务器保存用户的输入信息,使用<jsp:forward>转向success.jsp之后,success.jsp还可以访问用户输入的信息,因为输入同一次请求。
   使用response的请求:
   index.jsp中输入用户名和口令,提交给login_process.jsp,服务器保存用户的输入信息,使用response的sendRedirect方法相当于重新向服务器发送一次请求,这样上次的请求内容(用户名和口令)就不能共享了。
  
3、<jsp:include>标签
   把index.jsp中<%@ include="header.jsp"%>替换成<jsp:include page="header.jsp"/>
   从运行效果上相同。
   不同点:1、两个文件,目标文件是单独运行的,当前文件运行到<jsp:include>标签的时候,转向执行标签所指向的目标文件,执行之后返回继续标签之后的内容。

   <%@include %> 是静态包含,可以包含任何内容。 例如在A.jsp中 <%@ include file="a.txt" %> ,先把 a.txt 中的内容原封不动的包含到A.jsp 中,相当于一个生成一个新的jsp 再交给Servlet 容器(Tomcat)编译。 <jsp:include /> 是动态包含,例如在B.jsp 中<jsp:include path="c.jsp"/> ,Servlet容器将会先 编译c.jsp ,把c.jsp 的结果包含到B.jsp 中,然后再一起编译 B.jsp 。
  

   2、<%@ include%>指令是在编译(转换)的时候使用,<jsp:include>在运行的时候起作用。

   程序中如何选用:要导入的内容是不是每次都执行,如果每次都执行的话,应该使用<%@ include%>,如果是在特定的条件下,应该使用<jsp:include>。例如,登录之后要么转向success.jsp要么转向index.jsp,如果在程序中使用导入,应该用<jsp:include>。

4、<jsp:include>和<jsp:forward>区别

   把login_process.jsp中的<jsp:forward>替换成<jsp:include>:
<%@ page contentType="text/html;charset=gb2312"%>

<%
   // 先获取用户输入的用户名和口令,然后判断是否合法
   String username = request.getParameter("username");

   String userpass = request.getParameter("userpass");

   if(username.equals("zhangsan") && userpass.equals("zhangsan"))
   {
%>

       <jsp:include page="success.jsp"/>
<%
   }else{
%>
       <jsp:include page="index.jsp"/>
<%
   }
%>
    运行效果是相同的。但是有不同点,修改代码如下:
<%@ page contentType="text/html;charset=gb2312"%>
处理文件的前半部分<br>
<%
   // 先获取用户输入的用户名和口令,然后判断是否合法
   String username = request.getParameter("username");

   String userpass = request.getParameter("userpass");

   if(username.equals("zhangsan") && userpass.equals("zhangsan"))
   {
%>

       <jsp:include page="success.jsp"/>
<%
   }else{
%>
       <jsp:include page="index.jsp"/>
<%
   }
%>
<br>处理文件的后半部分

两次运行结果不相同。
分析原因:
   <jsp:forward>:先执行标签之前的内容,遇到标签的时候转向执行目标文件,执行完不返回,显示的内容为目标文件的内容,标签之前的内容执行,但是不显示。标签之后的内容不会执行,当然更不会显示。
   <jsp:include>:先执行标签之前的内容,遇到标签转向执行目标文件,执行完返回,继续执行标签之后的内容,显示的内容为:标签之前的内容+目标文件的内容+标签之后的内容,标签的前后都执行,都显示。

        总之<%@include file=“”%>和<jsp:include page=“”>的区别在于前者将页面包括进来,后者是当执行时才将页面包括进来,前者在编译期使用,后者在运行期使用,后者执行之后回来继续执行下面的代码

     <jsp:include page="">和<jsp:forward page="">的区别在于前者运行显示的内容为 标签之前的内容+目标文件内容+ 标签之后内容,而后者是当执行的标签时直接转入标签,标签之前内容虽然会执行,但是不表现出来,目标文件执行完之后也不返回

    <jsp:forward page="">和sendredirect在于前者可以将本页面的request和response传入目标文件,但是后者不行

前者相当于一次请求,后者相当于两次请求

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,我们需要创建一个Web项目,并在项目中创建以下JSP页面: 1. main.jsp:包含其他几个页面,同时处理错误页面。 2. register.jsp:用于用户注册,包含访问量统计的功能。 3. register_handle.jsp:处理用户注册信息,验证学号、密码和邮件地址。 以下是代码示例: main.jsp: ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>主页面</title> </head> <body> <jsp:include page="register.jsp" /> <%-- 这里可以包含其他页面 --%> <%-- 处理错误页面 --%> <% String errorMessage = (String)request.getAttribute("javax.servlet.error.message"); if(errorMessage != null) { out.println("<h3>出错啦,错误信息:"+errorMessage+"</h3>"); } %> </body> </html> ``` register.jsp: ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>注册页面</title> </head> <body> <jsp:include page="header.jsp" /> <h3>用户注册</h3> <form action="register_handle.jsp" method="post"> <label>学号:</label><input type="text" name="studentId" /><br /> <label>用户名:</label><input type="text" name="username" /><br /> <label>密码:</label><input type="password" name="password" /><br /> <label>确认密码:</label><input type="password" name="confirmPassword" /><br /> <label>邮件:</label><input type="text" name="email" /><br /> <input type="submit" value="提交" /> </form> <%-- 访问量统计 --%> <% int count = 0; if(application.getAttribute("count") != null) { count = (int)application.getAttribute("count"); } count++; application.setAttribute("count", count); out.println("本站访问量:"+count); %> <jsp:include page="footer.jsp" /> </body> </html> ``` register_handle.jsp: ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>注册处理页面</title> </head> <body> <jsp:include page="header.jsp" /> <% String studentId = request.getParameter("studentId"); String username = request.getParameter("username"); String password = request.getParameter("password"); String confirmPassword = request.getParameter("confirmPassword"); String email = request.getParameter("email"); boolean isError = false; String errorMessage = ""; // 验证学号是否为10位 if(studentId.length() != 10) { isError = true; errorMessage += "学号必须为10位;"; } // 验证密码是否与确认密码相同 if(!password.equals(confirmPassword)) { isError = true; errorMessage += "密码与确认密码不一致;"; } // 验证邮件地址是否正确 if(!email.matches("\\w+@\\w+\\.\\w+")) { isError = true; errorMessage += "邮件地址格式不正确;"; } if(isError) { // 跳回注册页面 request.setAttribute("errorMessage", errorMessage); request.getRequestDispatcher("register.jsp").forward(request, response); } else { // 处理成功,跳转到注册成功页面 session.setAttribute("username", username); session.setAttribute("password", password); response.sendRedirect("register_success.jsp"); } %> <jsp:include page="footer.jsp" /> </body> </html> ``` 我们还需要创建以下公共页面: header.jsp: ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>头部</title> </head> <body> <header> <h1>Web项目</h1> <nav> <ul> <li><a href="#">首页</a></li> <li><a href="#">关于我们</a></li> <li><a href="#">联系我们</a></li> </ul> </nav> </header> </body> </html> ``` footer.jsp: ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>底部</title> </head> <body> <footer> <p>版权所有 © 2019 Web项目</p> </footer> </body> </html> ``` register_success.jsp: ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>注册成功页面</title> </head> <body> <jsp:include page="header.jsp" /> <h3>恭喜您,注册成功!</h3> <p>用户名:${sessionScope.username}</p> <p>密码:${sessionScope.password}</p> <jsp:include page="footer.jsp" /> </body> </html> ``` 注意: 1. 在main.jsp中使用<%-- comments --%>隐藏注释,以避免在包含其他页面时出现问题。 2. 在register.jsp中使用<jsp:include>包含header.jsp和footer.jsp,以实现页面的复用。 3. 在register.jsp中使用<jsp:include>包含访问量统计的功能。 4. 在register_handle.jsp中使用request.getRequestDispatcher()和request.getRequestDispatcher().forward()实现跳回注册页面。 5. 在register_handle.jsp中使用response.sendRedirect()实现跳转到注册成功页面。 6. 在register_success.jsp中使用EL表达式${sessionScope.username}和${sessionScope.password}获取session中的值。 7. 在register_handle.jsp中使用正则表达式验证邮件地址格式。 8. 在main.jsp中使用request.getAttribute("javax.servlet.error.message")获取错误信息,并输出到页面中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值