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");
}
}
}