<%@ 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>