您的位置:首页 > Web前端 > JavaScript

jsp技术:day1--jsp简单用法、静态导入、动态导入、设置errorPage、<jsp:forward>

2016-07-28 14:17 651 查看

jsp简介:

JSP是Java Server Page的缩写,它是Servlet的扩展,它的作用是简化网站的创建和维护。

JSP是HTML代码与Java代码的混合体。

JSP文件通常以JSP或JSPX的扩展名。

JSP拥有自己的语法。

JSP形式上像HTML,但本质上是Servlet。

JSP的出现,使得将Web开发中的HTML与业务逻辑代码有效分离成为可能。通常JSP只负责生成动态的HTML文档,而业务逻辑由其他Java组件如JavaBean来实现。JSP可以通过Scriptlet来访问这些组件。

<% %>

ContentType与pageEncoding的区别

pageEncoding是jsp文件本身的编码 ,把jsp文件编译成java的时候给编译器用的 。

contentType的charset是指服务器发送给客户端时的内容编码 ,是浏览器解析网页的时候用的

如果两个任意设置了其中一个,另一个即会与此保持一致。但,contentType除可以设置charset外,还可以设置MIME类型,如text/html

Tomcat首次访问JSP的过程:



容器按照以下顺序处理JSP请求:

1、查找与JSP文件对应的Servlet,如果已经存在,就调用它的服务方法。

2、如果与JSP对应的Servlet不存在,就解析文件系统中的JSP文件,将它翻译成Servlet源文件,接着把Servlet源文件编译成Servlet类,然后再去初始化并运行Servlet。

3、 以下是经过翻译的JSP文件,可见在它的服务方法中存在以下对像

PageContext pageContext = null;

HttpSession session = null;

ServletContext application = null;

ServletConfig config = null;

JspWriter out = null;

Object page = this;

JspWriter _jspx_out = null;

PageContext _jspx_page_context = null;

JSP语法:

JSP指令。

<%@   指令名  属性=“值”%>


JSP声明。成员变量,或是成员方法.

<%!   …. %>


Java程序片段。不论有多少这样的代码块,都将包含_jspSerivice方法中。

<% … %>


Java表达式。-快速输出信息. _jspSerivice

底层是采用out.print(age);

<%= …%>


JSP隐含对像。

pageContext.request,response,session,confing,application

注意:

1、
<% %>
声明的是局部变量而
<%! %>
声明的是全局变量

2、
<%@include file="" %>
包含导入将要导入的jsp或其他文件采用jsp的方式翻译后的代码(html用out.println()封装,Java代码直接拷过来)拷入,只生成一个class,一个java。

通过errorPage属性控制页面出错,转向我们自己定义的错误页面,而不是tomcat做的错误页面

errorPage="jsps/error.jsp"


将错误页面导向jsps/error.jsp

在jsps/error.jsp中我们要设置
isErrorPage="true"
才能使用
exception
对象。

用户登录成功与失败

利用servlet控制登录成功与否,在登录成功之后,将登录的姓名设置到session中,转发到welcome.jsp页面。失败则返回登录界面。

在welcome.jsp页面中,利用快速输出从session对象中拿参数,静态包含两个jsp文件。一个用来显示网页底部的信息:

<h3>©2016 Baidu 使用百度前必读 意见反馈 京ICP证030173号 <br/>京公网安备11000002000001号</h3>
<a href="#">网站管理员</a>


一个用来防范用户如果不输入就提交,导致session和通过
request.getParameter("name");
拿到的都是空也能登录成功。

在include.jsp中:

if(session.getAttribute("name")==null){
response.sendRedirect(request.getContextPath()+"/index.jsp");
}


在web.xml中配置错误页面和配置session过期

配置session20分钟过期

<servlet-mapping>
之后写:

<session-config>
<session-timeout>20</session-timeout>
</session-config>


配置错误页面

<servlet-mapping>
之后写:

<error-page>
<error-code>500</error-code>
<location>/jsps/error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/jsps/error.jsp</location>
</error-page>


其中的
<error-code>500</error-code>
是网页显示500错误就导向错误页面

其中的
<exception-type>java.lang.Exception</exception-type>
是网页显示java.lang.Exception即只要是java的错误就导向错误页面

这种通过配置文件配置的优点是:

是开发更加简单方便

这种通过配置文件配置的缺点是:

造成web.xml文件臃肿

包含:

动态包含:
<jsp:forward>

转发的目标可以是jsp,servlet或html.

注意:之前在转请求转发时,在转发之后的代码也会被执行,而jsp源组件中
<jsp:forward/>
在转发以后的代码不会被执行。因为当你在写了
<jsp:forward/>
,翻译以后

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


<jsp:forward path = url />
中的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”/>


前面已经讲过<%@include file=..%>指令包含,这种包含属于静态包含。

还可以通过
<jsp:include page=…/>
包含目标页面,这种包含属于动态包含。

无论是静态还是动态,源组件与目标组件都共享请求范围内的数据。

通过具体示例来看它们的区别:

使用静态包含:

<body>
<%@include file="aa.jsp" %>
<p>
这是源页
</p>
</body>


两个页面最终只翻译成了一个Servlet文件。甚至在源组件上定义的变量在目标组件上也可以使用。因为翻译它们本身就是一体的。

动态包含:

将上例中的包含修改成运行时将出现一个错误。

这是因为两个不同的servlet之间无法访问对方的局部变量。

由此可见:

静态包含发生成编译时。

动态包含发生在运行时。

由于静态包含最终编译成一个Servlet文件,所以在执行时,它的执行效率要高于动态包含。

本文完整代码:

index.jsp

<%@ 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>
<h1>演示jsp技术</h1>
<%
String name = "小明";
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
session.setAttribute("name", "小米");

%>
<h2>------我是文字分割线1111111111111------</h2>
<%
out.print("<br/>name:"+name);
out.println("<br/>sessionName:"+session.getAttribute("name"));
%>
<%!
//加了“!”号后,就把变量声明成index_jsp类的成员变量
String className = "English";
public int sum(int n){
int s=0;
for(int i=1;i<=n;i++){
s+=i;
}
return s;
}
%>
<h2>------我是文字分割线2222222222222------</h2>
<%
out.print("<br/>className:"+className);
out.print("<br/>sum:"+sum(100));
%>
<h2>------从这里开始导入包含页------静态包含:共享一个request和一个response对象和局部变量</h2>
<!-- 静态包含是将下面的代码(采用jsp方式翻译后的java代码:
html:采用out.println()封装
java:原样 )插入到当前_jspService()中对应的位置 -->
<%@include file="jsps/a.jsp"%>
<h2>------从这里结束导入包含页------</h2>
<hr/>
<h2>------演示快速输出------</h2>
<%=className %><!-- 底层是将className封装成了out.println(className); -->
<br>

<h1>以下演示登录后的欢迎界面</h1>
<h2>登录界面</h2>
<form action="ForwardServlet" method="post">
Name:<input type="text" name="name" /><br/><br/>
<input type="submit" value="登录" />
</form>

<br>
<br>
<hr/>
<div>-----------我是传说中的分割线----------------------------</div>
<h1>以下演示动态包含</h1>
<h2>动态包含可以共享request和response,但不能共享局部变量,生成两个独立的jsp类</h2>
<br>
<jsp:include page="/jsps/b.jsp"></jsp:include>
<br>
<br>
<br>
<br>

</body>
</html>


index2.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" errorPage="jsps/error.jsp"%>
<%--这是jsp的注释--//上面的errorPage属性的作用,如果本页面出错了就转到 jsps/error.jsp页面去--%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<h1>演示jsp技术中的errorPage,isErrorPage</h1>

<%
int a = 100/0;//除数为0,会导致一个错误.由于上面设了errorPage属性,因此浏览器会转向显示error.jsp页面
%>
</body>
</html>


index3.jsp

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<h1>演示jsp技术中的jsp:forward标签</h1>
<jsp:forward page="index.jsp"></jsp:forward>
<h2>因为上面jsp:forward了,所以这里不会显示,页面已经转发到其他地方去了</h2>
<br/>
<br/>
<br/>
<br/>
<br/>
</body>
</html>


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>ForwardServlet</servlet-name>
<servlet-class>cn.hncu.servlet.ForwardServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>ForwardServlet</servlet-name>
<url-pattern>/ForwardServlet</url-pattern>
</servlet-mapping>
<!-- 配置session20分钟过期 -->
<session-config>
<session-timeout>20</session-timeout>
</session-config>
<!-- 配置错误页面  优点:可以是开发更简单;缺点:造成web.xml臃肿
<error-page>
<error-code>500</error-code>
<location>/jsps/error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/jsps/error.jsp</location>
</error-page>
-->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>


a.jsp

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

<h1>演示jsp的静态包含技术</h1>
<h2>-----我是文字分割线aaaaaaaaaaaaa-------</h2>
<%
out.println("<br/>name:"+name);//局部变量,可以访问到
out.println("<br/>className:"+className);//全局变量,可以访问到
out.println("<br/>sum:"+sum(100));//全局方法,可以访问到
%>


b.jsp

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

<title>这是被动态导入的页面</title>

</head>

<body>
<h1>这是被jsp:include(动态导入)的页面</h1>
<%
out.println("传的发哦圣诞节佛爱的金佛大方几哦啊的较深的发生大佛");
%>
</body>
</html>


error.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isErrorPage="true"%>
<%--这是jsp的注释--//上面的errorPage属性的作用,如果本页面出错了就转到 jsps/error.jsp页面去--%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<h1>这是我自己想要的errorPage页面</h1>
<%
out.print("<br/>"+exception.getMessage());
%>
</body>
</html>


foot.jsp

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<h3>©2016 Baidu 使用百度前必读 意见反馈 京ICP证030173号 <br/>京公网安备11000002000001号</h3> <a href="#">网站管理员</a>


include.jsp

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

<%
//所有安全资源都添加这个安全登录控制
if(session.getAttribute("name")==null){ response.sendRedirect(request.getContextPath()+"/index.jsp"); }
%>


welcome.jsp

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<!-- 防范空值即用户不输入直接提交 -->
<%@include file="/jsps/include.jsp" %>
</head>

<body>
<h1>欢迎进入城院</h1>
<%=session.getAttribute("name") %><br/>
<%@include file="/jsps/foot.jsp" %>
</body>
</html>


ForwardServlet

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 ForwardServlet 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.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
if (name.startsWith("hncu")) {//假如是hncu开头就认为登录成功,真的登录要去数据库中找
request.getSession().setAttribute("name", name);
response.sendRedirect(request.getContextPath()+"/jsps/welcome.jsp");
}else{
response.sendRedirect(request.getContextPath()+"/index.jsp");

}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: