JSP学习
JSP:运行在服务器端的语音,Java Server Pages可以响应客户端请求,可以动态生成HTML,XML或其他文档的web网页技术标准以java语音作为脚本语言的,jsp网页为整个服务器端的java库单元提供一个接口来服务HTTP的应用程序jsp文件的后缀名为:*.jsp,跨平台的,linux和windows均可运行动态网页开发技术,使用jsp标签在HTML网页中插入java代码标签通常以<%代码%>的形式jsp是一种java servlet,主要用于实现java web程序的用户界面部分jsp通过网页表单获取用户输入的数据,访问数据库及其他数据源,然后动态的创建网页Tomcat文件目录介绍:1)bin:二进制文件,tomcat的启动与关闭2)config:配置文件,最重要的是server.xml,更改端口号3)lib:库文件,tomcat所需要的jab包4)logs;日志文件5)temp:临时文件6)webapps:web应用程序,web应用放到此目录下浏览器可以直接访问7)work:编译后的class文件java工程文件结构:
deployment descriptor:部署的描述web app libs:自己加的包可以放到里面build:编译之后的文件WebContent:放进写入的页面JSP处理:WEB服务器如何用jsp创建网页
1):浏览器发送HTTP请求2):web识别到是一个jsp请求,并将该引擎传递给jsp引擎,通过URL或者.JSP文件来完成3):jsp引擎从磁盘中载入jsp文件,将他们转换为servlet,转化就是简单地将所有的模板文本改用print()语句,并将所有的jsp元素转化为java代码4):jsp引擎将servlet编译成可执行类,并将原始请求传递给servlet引擎5):web服务器的某个组件会调用servlet引擎,然后载入并执行servlet类。servlet产生HTML格式的输出,并将其内嵌于HTTP response中上交给web服务器6):web服务器以静态HTML的形式将HTTP response返回到浏览器中7):web浏览器处理HTTP response返回的HTML网页,就好象处理静态网页一样JSP生命周期,从创建到销毁的整个过程:编译、初始化、执行、销毁
1)jsp编译:当浏览器发送jsp请求时,jsp引擎要检测是否需要编译文件。包括:解析jsp文件,将jsp转为servlet,编译servletJSP语法
脚本程序包含任意的java变量,表达式等<%%>或者<jsp:scriptlet></jsp:scriptlet>任何文本,html标签,jsp元素必须写在脚本程序的外面
JSP声明的语法格式:<%! 声明 %> 或者 <jsp:declaration></jsp:declaration>
在jsp中必须先声明变量或方法之后才能使用JSP表达式:<%= 表达式 %> 或者<jsp:expression>表达式</jsp:expression>
先被转化为字符串,然后插入到表达式出现的地方JSP注释:<%-- --%>
JSP指令用来设置与整个jsp页面相关的属性,键值对的形式存在,并用逗号隔开
指令的语法格式:<%@ directive attribute="true" %>三种指令标签1)<%@ page attribute="true"%>:定义页面的依赖属性,比如脚本语言,error页面,缓存需求。提供当前页面的使用说明buffer 指定out对象使用缓冲区的大小autoFlush 控制out对象的 缓存区contentType 指定当前JSP页面的MIME类型和字符编码errorPage 指定当JSP页面发生异常时需要转向的错误处理页面isErrorPage 指定当前页面是否可以作为另一个JSP页面的错误处理页面extends 指定servlet从哪一个类继承import 导入要使用的Java类info 定义JSP页面的描述信息isThreadSafe 指定对JSP页面的访问是否为线程安全language 定义JSP页面所用的脚本语言,默认是Javasession 指定JSP页面是否使用sessionisELIgnored 指定是否执行EL表达式isScriptingEnabled 确定脚本元素能否被使用2)<%@ include file='文件相对的url地址' %>:包含其他文件,包含的文件类型可以是jsp文件,文本文件,xml文件
3)<%@ taglib %>:引入标签库的定义
JSP行为,动作元素,在请求阶段起作用
JSP行为标签使用xml语法结构控制servlet引擎。他能够动态插入一个文件,重用JavaBean组件,引导用户去另一个页面等。严格遵守xml标准只有一种定义语法格式:<jsp:action_name attribute="true"/>javaBean是MVC模型中的model,在一般的模型中称数据层,用来设置数据的属性和行为,主要用来处理数据库和servlet之间的数据传输jsp:include 在当前页面中包含一些静态或动态资源,把指定文件插入正在生成的页面.与include指令在转换为servlet时引入文件;而动作指令是在页面被请求时加载文件<jsp:include page='file url' flush='true'/>jsp:useBean 寻找或初始化一个javaBean组件,用来加载将在jsp页面中使用的javabean.在类载入后,我们既可以通过 jsp:setProperty 和 jsp:getProperty 动作来修改和检索bean的属性。
语法:<jsp:useBean id='name' class='package.class'/>class 指定Bean的完整包名。type 指定将引用该对象变量的类型。beanName 通过 java.beans.Beans 的 instantiate() 方法指定Bean的名字。 jsp:setProperty 设置javaBean组件的值语法:<jsp:useBean id='myName' class='package.class'><jsp:setProperty name='myName' property='someProperty> jsp:getProperty 将javaBean组件的值插入到output中jsp:forward 从一个jsp文件向另一个文件传递包含用户请求的request对象语法:<jsp:forward page='相对url地址'/>jsp:elemnet 动态创建一个xml元素jsp:attribute 定义动态创建的xml的属性jsp:body 定义动态创建的xml的主体jsp:text 用于封装模板数据常见的动作属性:id属性:动作元素的唯一标识符,可以在jsp页面中引用。动作元素创建的id值可以通过PageContext来调用scope属性:识别动作元素的生命周期,定义了相关联id对象的寿命,a:page,b:request,c:session,d:applicationJSP隐含对象
requset:HTTPServletRequest类的实例,javax.servlet.http.HttpServletRequest 类的实例每当客户端请求一个jsp页面时,jsp引擎就会制造一个新的request对象来代表这个请求。提供了一系列方法获取HTTP请求头,cookies,HTTP请求方法等使用HTTPServeletRequest的getParameterNames()方法获得请求提交的所有参数名字,即获得所有变量的名称,该方法返回一个枚举一旦有了这个Enumeration,可以调用hasMoreElements()方法确定是否还有元素,以及使用nextElement()方法获得每个参数的名称使用getParameter(paramName)获得参数值
response:HTTPServletResponse类的实例,javax.servlet.http.HttpServletResponse类的实例
服务器在创建request对象时同时会创建用于响应这个客户端的response对象,处理HTTP头模块的接口,添加时间戳,添加新的cookies,状态码等out:PrintWriter类的实力,javax.servlet.jsp.JspWriter 类的实例,用于将结果输出的网页上,在response对象中写入内容
session:HttpSession类的实例,javax.servlet.http.HttpSession 类的实例,跟踪各个客户端请求间的会话
application:ServletContext类的实例,与应用上下文有关。这个对象在整个jsp页面的整个生存周期中都代表着这个jsp页面。通过向application添加属性,所有组成web应用的jsp页面都能访问这个属性
config:ServletConfig类的实例
pageContext:PageContext类的实例,提供对jsp页面所有对象以及命名空间的访问。javax.servlet.jsp.PageContext 类的实例,用来代表整个jsp页面。主要用来访问页面信息,过滤掉大部分实现细节。page:类似于java类中的this关键字exception:Exception类的对象,代表发送错误的jsp页面中对应的异常对象JSP字面量
1):布尔值:false or true2):整形int:与java一样3):浮点型float:与java一样4):字符串String:单引号或双引号5):NUllJSP过滤器
JSP和Servlet中的过滤器都是Java类过滤器可以动态的拦截请求和响应,以变换或使用包含在请求或响应中的信息过滤器是可以用于Servlet编程的Java类,可以实现的目的:1)在客户端的请求访问后端资源之前,拦截这些请求2)服务器的响应发送到客户端之前,处理这些响应各种类型的过滤器:身份验证过滤器数据压缩过滤器加密过滤器触发资源访问事件过滤器图像转换过滤器日志记录和审核过滤器MIME-TYPE链过滤器标记化过滤器过滤器通过web部署描述符(web.xml)的xml标签来声明,然后映射到您的应用程序的部署描述符中的Servlet名称或URL模式
当web容器启动web应用程序时,它会为您在部署描述符中声明的每一个过滤器创建一个实例Filter的执行顺序和web.xml配置文件的配置顺序一致,一般把filter配置在所有servlet之前Servlet过滤器
过滤器实现了javax.servlet.Filter接口的java类,定义了三个方法1.public void doFilter(ServletRequest, ServletResponse, FilterChain)完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet首先调用过滤器的doFilter方法,FilterChain用户访问的后续过滤器2.public void init(FilterConfig filterConfig)web服务器启动时,web应用程序创建Filter的实例对象,并调用其init()方法,读取web.xml配置,完成初始化工作,为后续的用户请求做好拦截的准备工作3.public void destory()Servlet容器在销毁过滤器前调用该方法,释放资源FilterConfig的使用
Filter的init方法中定义了一个filterConfig实例对象web.xml的配置信息如下:<filter> <filter-name>LoginFilter</filter-name> <filter-class>com.run.test.LoginFilter</filter-class> <init-para> <para-name>site</para-name> <para-value>book</para-value> </init-para></filter>在init方法中使用FilterConfig对象获取参数:
public void init(FilterConfig config){ // 获取初始化参数 String site= config.getInitParameter("site");} 关于servlet的@WebServlet注解@WebServlet注解用于标注在一个继承了HttpServlet类之上,属于类级别的注解。用法形如:@WebServlet("/DisplayHeader1") // 扩展 HttpServlet 类public class DisplayHeader extends HttpServlet { // 处理 GET 方法请求的方法public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {其中 /DisplayHeader1 表示访问该servlet的 url 映射(地址)(此处为相对路径,即 “项目名称/DisplayHeader1” )。
该注解的作用等价于 在web.xml中配置的该servlet的<servlet-mapping>元素中<url-pattern>的配置,比如:
<servlet><!-- 类名 --><servlet-name>DisplayHeader</servlet-name><!-- 所在的包 --><servlet-class>test.DisplayHeader</servlet-class></servlet><servlet-mapping><servlet-name>DisplayHeader</servlet-name><!-- 访问的网址 --><url-pattern>/DisplayHeader2</url-pattern></servlet-mapping>此时,访问如下两个路径的效果是一样的,不互斥:http://localhost:8080/test/DisplayHeader1和http://localhost:8080/test/DisplayHeader2此为在本机上进行的测试,其中test为项目名称。
JSP过滤器实例,Servlet过滤器的实例,输出网站名和地址
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
// 导入必须的java库import javax.servlet.*;import java.util.*;//实现Filter类
public class LoginFilter implements Filter{ public void init(FilterConfig config) throws ServletException{ // 获取初始化参数 String site= config.getInitParameter("site"); // 输出网站名称 System.out.println("网站:wwww.baidu.com"); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException { // 输出站点名称 System.out.println("www.baidu.con"); // 把请求传回过滤链 chain.doFilter(request, response); }}——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
DisplayHeader.java的文件:
//导入必需的 java 库import java.io.IOException;import java.io.PrintWriter;import java.util.Enumeration;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet("/DisplayHeader")
// 扩展HttpServlet
public class DisplayHeader extends HttpServlet{ // 处理get请求方法 public void doGet(HttpServletRequest request, HttpServletResponse response){ // 设置响应内容类型 response.setContentType("text/html;charset=UTF-8"); // 获得一只笔,在网页上画你想画的东西 PrintWriter out = response.getWriter(); String title = "Header"; String docType = "<!DOCTYPE html> \n"; out.println(docType + "<html>\n" + "<head><meta charset=\"utf-8\"><title>" + title + "</title></head>\n"+ "<body bgcolor=\"#f0f0f0\">\n" + "<h1 align=\"center\">" + title + "</h1>\n" + "<table width=\"100%\" border=\"1\" align=\"center\">\n" + "<tr bgcolor=\"#949494\">\n" + "<th>Header 名称</th><th>Header 值</th>\n"+ "</tr>\n"); // 获取请求头参数名,得到一个枚举 Enumeration headerNames = request.getHeaderNames(); // 对枚举进行迭代 while(headerNames.hasMorElements()){ String paraName = (String)headerNames.nextElement(); out.print("<tr><td>"+paraName+"</td>\n"); String paraValue = request.getHeader(paraName); out.print("<td>"+paraName+"</td></tr>\n"); } out.println("</table>\n</body></html>"); } // 处理post方法请求 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ doGet(request, resopnse); }} _______________________________________________________________________________________________________________________部署描述符web.xml的Servlet过滤器映射(Servlet Filter Mapping)
定义一个过滤器,然后映射一个URL或Servlet。这与定义Servlet,然后映射到一个URL模式相同,例如:<web-app> <filter> <!-- 类名--> <filter-name>LoginFilter</filter-name> <!-- 包名--> <filter-class>com.runoob.test.LoginFilter</filter-class> <init> <para-name>site</para-name> <para-value>"网址"</para-value> </init> </filter> <filter-mapping> <filter-name>LoginFilter</filter-name> <!-- 拦截的网址, 拦截所有的servlet--> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <!-- 类名--> <servlet-name>DisplayHeader</servlet-name> <!-- 包名--> <servlet-class>com.runoob.test.DisplayHeader</servlet-class> </servlet> <servlet-mapping> <!-- 类名--> <servlet-name>DisplayHeader</servlet-name> <!-- 要访问的地址--> <url-pattern>/TomcatTest/Displayheader</url-pattern> </servlet-mapping></web-app>
web.xml配置各节点说明
<filter>指定一个过滤器。<filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。<filter-class>元素用于指定过滤器的完整的限定类名。<init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。<filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径<filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字<url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)<servlet-name>指定过滤器所拦截的Servlet名称。<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher>子元素用来指定 Filter 对资源的多种调用方式进行拦截。<dispatcher>子元素可以设置的值及其意义REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。