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"); } } }
相关文章推荐
- LostRoutes项目日志——编辑project.json
- json 去掉null 的一些方法
- JS中的自执行函数
- [Json.net]忽略不需要的字段
- PhantomJS(webkit)/SlimerJS (Gecko) + CasperJS获取JavaScript渲染后的网页内容
- 如何解决Sharepoint Digest 超时问题
- [php学习十三]javaScript的基本练习4-与php的相互调用
- js设置、修改、获取、删除 cookie
- Json 批量表格/表单数据的处理
- 解决jsp中超链接传中文参数时乱码问题
- Three.js基础探寻四——立方体、平面与球体
- 对Extjs中store的多种操作
- js刷新整个页面包括引入进来的jsp
- jsp获取当前最新浏览器
- LostRoutes项目日志——在main.js中添加多分辨率适配
- 使用JavaScript和canvas做精确的像素碰撞检测
- json 解析 多条信息时 只解析自己想要的信息
- 用JS检测必须填写的字段是否为空(使用了函数嵌套)
- JSP重定向小例子(不讲原理)
- rapidjson::Document _doc