java--jsp(Java Server Page)_2

这里写图片描述

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <title>JSP技术演示</title>
  </head>
    <body>
    <h2>这是主页</h2>
    <h3>一个登陆页面用于演示静态包含和动态包含--用标签</h3>
    <form action="login" method="post">
        姓名:<input type="text" name="name"/><br/>
        <input type="submit" value="提交"/> 
    </form>


    <a href="jsps/temp.jsp">演示jsp-forward</a> <br/>
    <br/><br/>

    <a href="foot">演示访问安全目录中的jsp页面--这种页面一般通过servlet转发,这里省略写servlet</a> <br/>
    <br/><br/><br/>

    <%@include file="/jsps/foot.jsp" %>
  </body>
</html>

请求转发:

JSP通过< jsp:forward/>标签来实现请求转发。
转发的目标可以是jsp,servlet或html.
注意:之前在转请求转发时,在转发之后的代码也会被执行,而jsp源组件中< jsp:forward/>在转发以后的代码不会被执行。因为当你在写了< jsp:forward/>,翻译以后源代码如下:

if (true) {
        _jspx_page_context.forward("/index.jsp");
        return;
}

中的url即可以以/开头也可以不以/开头,以/开头表示绝对路径。 如:
        helloapp/dir1/source.jsp
        helloapp/dir1/dir2/target.jsp
可以通过以下两种方式从souce.jsp转到target.jsp
        < jsp:forward path=“dir2/target.jsp”/>
        < jsp:forward path=“/dir1/dir2/target.jsp”/>
源组件还可以通过< jsp:param/>向目标组件添加额外的参数:
        < jsp:forward page=“target.jsp”>
                < jsp:param name=“name1” value=“name1”/>
                < jsp:param name=“name2” value=“name2”/>
        < /jsp:forward>
这里演示jsp的转发的目标是servlet

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<jsp:forward page="/temp"></jsp:forward>
package cn.hncu.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TempServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.getWriter().println("请 先登陆,,,亲");
    }

}

这里写图片描述

包含:
前面已经讲过< %@include file=..%>指令包含,这种包含属于静态包含。
还可以通过< jsp:include page=…/>包含目标页面,这种包含属于动态包含。

package cn.hncu.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    doPost(request, response);
}


public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    request.setCharacterEncoding("utf-8");
    String name=request.getParameter("name");
    if(name!=null&&name.startsWith("hncu")){
        System.out.println("LoginServlet-name:"+name);
        request.getSession().setAttribute("name", name);
        response.sendRedirect(request.getContextPath()+"/jsps/wel.jsp");
    }else{
        response.sendRedirect(request.getContextPath()+"/index.jsp");
    }
}

}


<%@page language="java" import="java.util.*"  pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>欢迎页面</title>
    <%
        /*
           //安全登录防护
            if(session.getAttribute("name")==null){
                response.sendRedirect(request.getContextPath()+"/index.jsp");
            }
        */
        int a=100;
        int b = 200;
        out.println("a="+a);

    %>


    <!-- 用inclue指令(编译指令)导入安全登录防护代码(静态包含) -->
    <!-- 静态包含:把被包含代码拷到当前类中形成一个新的类,执行。包含与被包含代码是合写在同一个类(service方法)中,其中的变量是完全共享的 -->
    <%@include file="a.jsp" %>


    <!-- 动态包含:用jsp:incluce标签(操作指令)来实现,,被包含的代码会生成一个独立的类。包含与被包含代码是两个不同的类,只共享request -->
    <jsp:include page="b.jsp"></jsp:include>


  </head>

  <body>
    <h2>登陆成功页面</h2>
    <%@include file="foot.jsp" %>
  </body>
</html>

这是登陆成功页面
这里写图片描述
这是登陆失败页面
这里写图片描述
无论是静态还是动态,源组件与目标组件都共享请求范围内的数据。
通过具体示例来看它们的区别:
静态包含:
1、使用静态包含:
        < body>
                <%@include file=”aa.jsp” %>
                < p>
                        这是源页
                < /p>
        < /body>
2、两个页面最终只翻译成了一个Servlet文件。甚至在源组件上定义的变量在目标组件上也可以使用。因为翻译它们本身就是一体的。

<%@ page language="java" import="java.util.*,java.awt.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%
    System.out.println(a);//因为是静态包含,变量是共享的,所以可以读到包含页的信息
    //安全登录防护
    if(session.getAttribute("name")==null){
        response.sendRedirect(request.getContextPath()+"/index.jsp");
    }
 %>

动态包含:
1.将上例中的包含修改成< jsp:include page=“aa.jsp”/>运行时将出现一个错误。
2.这是因为两个不同的servlet之间无法访问对方的局部变量。

<%@ page language="java" import="java.util.*,java.awt.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%
    //System.out.println(b);//因为是动态包含,变量不共享,所以读不到包含页的信息
    //安全登录防护
    if(session.getAttribute("name")==null){
        response.sendRedirect(request.getContextPath()+"/index.jsp");
    }
 %>

由此可见:
静态包含发生成编译时。
动态包含发生在运行时。
由于静态包含最终编译成一个Servlet文件,所以在执行时,它的执行效率要高于动态包含。
将JSP部署到web.xml中:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>
  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>cn.hncu.servlet.LoginServlet</servlet-class>
  </servlet>
  <!-- 配置安全目录当中的东西,可以被外界使用-->
  <servlet>
    <servlet-name>foot</servlet-name>
    <jsp-file>/WEB-INF/jsps/foot.jsp</jsp-file>
   </servlet>
  <servlet>
    <servlet-name>TempServlet</servlet-name>
    <servlet-class>cn.hncu.servlet.TempServlet</servlet-class>
  </servlet>


  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>foot</servlet-name>
    <url-pattern>/foot</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>TempServlet</servlet-name>
    <url-pattern>/temp</url-pattern>
  </servlet-mapping>    
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

注意:WEB-INF中的资源是受保护的资源,这是JavaEE的规范,任何外部的程序都不能直接访问此目录中的任何资源。如果要向外公布WEB-INF中的资源则必须在web.xml中配置。
安全目录的jsp

<%@page language="java" import="java.util.*"  pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  <h1>安全目录中的JSP页面</h1>
  <font color="red" size="4">安全目录当中所有东西必须要配置路径才能访问,包括图片</font><br/>
  <img src="<%=request.getContextPath()%>/jsps/foot.jpg"></img>

这里写图片描述

非安全目录的jsp页面(不需要配置web.xml)

<%@page language="java" import="java.util.*"  pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  <h1>不是安全目录中的JSP页面</h1>
  <img src="<%=request.getContextPath()%>/jsps/foot.jpg"></img>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章