JSP学习

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,编译servlet

JSP语法
脚本程序包含任意的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页面所用的脚本语言,默认是Java
session 指定JSP页面是否使用session
isELIgnored 指定是否执行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:application

JSP隐含对象
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 true
2):整形int:与java一样
3):浮点型float:与java一样
4):字符串String:单引号或双引号
5):NUll

JSP过滤器
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> ";
out.println(docType +
"<html> " +
"<head><meta charset="utf-8"><title>" + title + "</title></head> "+
"<body bgcolor="#f0f0f0"> " +
"<h1 align="center">" + title + "</h1> " +
"<table width="100%" border="1" align="center"> " +
"<tr bgcolor="#949494"> " +
"<th>Header 名称</th><th>Header 值</th> "+
"</tr> ");

// 获取请求头参数名,得到一个枚举
Enumeration headerNames = request.getHeaderNames();
// 对枚举进行迭代
while(headerNames.hasMorElements()){
String paraName = (String)headerNames.nextElement();
out.print("<tr><td>"+paraName+"</td> ");
String paraValue = request.getHeader(paraName);
out.print("<td>"+paraName+"</td></tr> ");
}
out.println("</table> </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:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。