JSP

​ JSP:JavaServerPageSUN公司提供的动态网页编程技术,是JavaWeb服务器端的动态资源

JSP的基本语法

简介

​ JSP:JavaServerPageSUN公司提供的动态网页编程技术,是JavaWeb服务器端的动态资源 ​ 它相比html而言,html只能为用户提供静态数据,而Jsp技术充许在页面中嵌套java代码,为用户提供动 态数据 ​ 相比servlet而言,servlet很难对数据进行排版,而isp除了可以用java代码产生动态数据的同时,也很容易对数据进行排版, ​ 不管是JSP还是Servlet,虽然都可以用于开发动态Web资源。但由于这2门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把jsP技术作为数据显示模板来使用 ​ 其实Jsp就是一个Servlet,当我们第一次访问Jsp的时候,Jsp引擎都会将这个Jsp翻译成一个Servlet,这个文件存放在tomcat(源码自录)中的work自录中。

注释

在JSP中支持两种注释的语法操作: 一种是显示注释,这种注释是充许客户端看见的;另一种是隐式注释,此种注释是客户端无法看见的

​ ①显示注释语法:从HTML风格继承而来 ​ ②隐式注释语法:从JAVA风格继承;JSP自己的注释

JSP的三种注释方式

1)	//注释,单行注释/*多行注释*/
2)	<!--HTML风格的注释-->
3)	<%--JSP注释--%> 

Scriptlet

​ 在JSP中最重要的部分就是Scriptlet**(脚本小程序),所有嵌入在HTML代码中的Java程序。**

​ 在JSP中一共有三种Scriptlet代码:都必须使用Scriptlet标记出来

第一种:<%  %>java脚本段,可以定义局部变量、编写语句
第二种:<%! %>声明,可以定义全局(成员)变量、方法、类
第三种:<%= %>:表达式,数据一个变量或具体内容

通过观察解析为java文件的jsp代码理解三种小脚本

JSP的指令标签

​ 使用包含操作,可以将一些重复的代码包含进来继续使用,从正常的页面组成来看,有时可能分为几个区 域。而其中的一些区域可能是一直不需要改变的,改变的就其中的一个具体内容区域。现在有两种方法可以实现上述功能 ​ 方法一:在每个JSP页面(HTML)都包含工具栏、头部信息、尾部信息、具体内容 ​ 方法二:将工具栏、头部信息、尾部信息都分成客个独立的文件,使用的时候直接导入 ​ 很明显,第二种方法比第一种更好,第一种会存在很多重复的代码,并且修改很不方便,在JSP中如果要想 实现包含的操作,有两种做法:静态包含、动态包含,静态包含使用include指令即可,动态包含则需要使用 include动作标签。

include静态包含

<%@include file="要包含的文件路径" %> <!--相对路径-->

例如:

<%@include file="include.isp" %> 或
<%@include file="include.htm1"%>

​ 静态包含就是将内容进行了直接的替换,就好比程序中定义的变量一样是在servlet引擎转译时,就把此文件 内容包含了进去(两个文件的源代码整合到一起,全部放到ispService方法中),所以只生成了一个servlet,所以两个页面不能有同名的变量。运行效率高一点点。耦合性较高,不够灵活。

include动态包含

​ 动态包含在代码的编译阶段,包含和被包含部分是两个独立的部分,只有当运行时,才会动态包含进来,好比方法的调用。

<jsp:include page="include.jsp"></jsp:include>

**注意:**动态包含,中间不要加任何内容,包括空格,除非确认要使用参数,否则报错!

<jsp:include page="include.htmi"></isp:include>
<%
	string a="hello.jsp";
%>
<jsp:include page="<%=a%>"></jsp:include>
使用动态包含还可以通过在页面之间传参
接收参数通过**request.getParameter(name);**
<jsp:include page="footer.jsp">
	<jsp:param name="uname" value="admin"/> 
	<jsp:param name="msg" value="<%str%>"/>
</jsp:include>
//获取动态包含传递的参数
String uname=request.getParameter("uname") 
String msg = request.getParameter("msg")

JSP的四大域对象

四种属性范围

​ 在SP中提供了四种属性的保存范围,所谓的属性保存范围,指的就是一个设置的对象,可以再多少个页面中 保存并可以继续使用

1.page范围 pagecontext:只在一个页面中保存属性,跳转之后无效 2.request范围 request:只在一次请求中保存,服务器跳转后依然有效 3.session范围 session:在一次会话范围中,无论何种跳转都可以使用 4.application范围 application:在整个服务器上保存

方法描述
public void setAttribute(Stringname,objecto)设置属性的名称及内容
public Object getAttribute(String name)根据属性名称取属性
publicvoid removeAttribute(Stringname)删除指定的属性

验证属性范围的特点

  1. page 本页面取得 服务器端跳转(<jsp:forward>)后无效
  2. request 服务器跳转有效,客户端跳转无效 如果是客户端跳转,则相当于发出了两次请求,那么第一次的请求将不存在了;如果希望不管是客户端还是服务器跳转,都能保存的话,就需要继续扩大范围。
  3. session 无论客户端还是服务器端都可以取得,但是现在重新开启一个新的浏览器,则无法取得之前设置的sessior 了,因为每一个session只保存在当前的浏览器当中,并在相关的页面取得对于服务器而言,每一个连接到它的客户端都是一个session 如果想要让属性设置一次之后,不管是否是新的浏览器打开都能取得则可以使用application
  4. application 所有的application属性直接保存在服务器上,所有的用户(每一个session)都可以直接访问取得 只要是通过application设置的属性,则所有的session都可以取得,表示公共的内容,但是如果此时服务器重启了,则无法取得了,因为关闭服务器后,所有的属性都消失了,所以需要重新设置
JSP中跳转方式 
1,服务端跳转
	<jsp:forward page="跳转的页面地"></jsp:forward>
	相当于req.getRequestDispatcher("").forward(req,resp);
2,客户端跳转
	超链接

EL表达式的使用

EL表达式的语法

​ EL(ExpressionLanguage)是为了使JSP写起来更加简单。表达式语言的灵感来自于ECMAScript和 XPath表达式语言,它提供了在JSP中简化表达式的方法,让Jsp的代码更加简化。

语法结构非常简单:$(expression)

​ EL表达式一般操作的都是域对象中的数据,操作不了局部变量。 ​ 域对象的概念在JSP中一共有四个:pageContext,request,session,application;范围依次是,本页面,一次请求,一次会话,整个应用程序。 ​ 当需要指定从某个特定的域对象中查找数据时可以使用四个域对象对应的空间对象,分别是:pageScope ``requestScope,sessionScope,applicationScope ​ 而EL默认的查找方式为从小到大查找,找到即可。当域对象全找完了还未找到则返回空学符串“”

EL表达式的使用

获取数据

设置域对象中的数据

<%
pagecontext.setAttributec"uname","zhangsan");//page作用域 
request.setAttribute("uname,"1isi")://request作用域
session.setAttribute("uname","wangwu");//session作用域
application.setAttribute("uname","zaholiu");//application
%>

获取域对象的值

<%--获取域对象中的数据:默认查找方式为从小到大,找到即止。若四个范围都未找到,则返回空字符串。--%>
${uname}
<!--输出结果为:zhangsan-->

获取指定域对象的值

${pageScope.uname}<!-page作用域-->
${requestScope.uname} <!--request作用域-->
${sessionScope.uname} <!--session作用域-->
${applicationScope.uname}<!--application作用域-->

获取List

<%
	List<string>1ist =new ArrayList<string>O;
	ist.add("aaa"); 1ist.add("bbb"); 1ist.addc"ccc");
	request.setAttribute("1ist",1ist);
%> 
<%--
获取List中指定下标的数据
s(1ist[下标] 
获取集合的长度
stlist.size 
注:1ist代表的是存在域对象中的变量名(限域变量名)
--%>
${1ist[1]}

获取Map

<%
	Map map=new HashMap();
    map.put("aaa","i1i"); 
    map.put("bbb",2222); 
    map.put("ccc-a",333);
	request.setAttribute("map",map);
%>
<%--
获取Map中指定值
${map["key"]}或${map.key} 
注:map代表的是存在域对象中的变量名(限域变量名)
--%>
${map.aaa} 
${map["bbb"]}

获取JavaBean对象

User.java

<%
	User user = new User(); 
	user.setuserId(i);
	user.setuname("zhangsan"); 
	user.setupwd("123456");
	request.setAttribute("user",user);
%>
<%--JavBean中的属性字段需要提供get方法--%> 
${user}	<%--获取对象--%>
${user.uname}<%--获取对象中的属性--%>
empty
<%--
	empty
		判断域对象是否为空。为空,返回true;不为空返回fa1se;
			${empty 限域变量名}
		判断对象是否不为空。
			${!empty 限域变量名}
--%>
$(empty uname} 
${empty 1ist} 
${empty map} 
${empty user}

备注

如果域对象是字符串,下面几种情况都是empty

  • 不存在
  • null
  • 空字符串

如果域对象是List,下面几种情况都是empty

  • null
  • 没有长度

Map与List同理

如果域对象是JavaBean,下面几种情况都是empty

  • null
EL运算
<%
	request.setAttribute("a",10); 
	request.setAttribute("b",2); 	
	request.setAttribute("c","aa"); 
	request.setAttribute("d","bb");
%>

等值判断

<%--
	比较两个值是否相等,返回true或fa1se
	== 或 eq
--%>
${a==b}
${a eq b}
${ c == 'aa'}

算术运算

<%--
	加法:+ 
	减法:-
	乘法:*
	除法:/ 或 div
--%>
${a+b}
${a/b}
${a div b}

大小比较

<%--
	大于:> 
	小于:<
	大于等于:>= 
	小于等于:<=
--%>
${a>b}
${a+1>10} 
${a+b>=10}
${ a>b && b>5 }
${ a+b>10 || a-b>5 }

JSTL

标签的使用

Java Server Pages Standard Tag Libray(JSTL):JSP标准标签库,是一个定制标签类库的集合,用于解决一些 常见的问题,例如代一个映射或者集合、条件测试、XML处理,甚至数据库和访问数据库操作等。 ​ 我们现在只讨论JSTL中最重要的标签,选代集合以及格式化数字和日期几个标签 ​ 核心标签库:http://java.sun.com/isp/jstl/core ​ 包含Web应用的常见工作,比如:循环、表达式赋值、基本输入输出等。

格式化标签库:http://iava.sun.com/isp/istl/fmt ​ 用来格式化显示数据的工作,比如:对不同区域的日期格式化等 为了在ISP页面使用JSTL类库,必须以下列格式使用taglib指令:

<%@taglib uri="" prefix=""%> 

例如:

<%@taglib uri="http://java.sun.com/jsp/jst1/core" prefix="c"%>

前缀可以是任意内容,遵循规范可以使团队中由不同人员编写的代码更加相似:所以,建议使用事先设计好

JavaBean组件

第一节:JavaBean组件引入

JavaBean是使用Java语言开发的一个可重用的组件,在JSP开发中可以使用 JavaBean减少重复代码,使整个JSP代码的开发更加灵活简洁

第二节:创建JavaBean

<jsp:userBean id=”实例化对象的名称” scope=”保存范围” class=”类完整名称”/>

Scope:作用范围,page,request,session,application,默认是page。

第三节:设置属性值

<jsp:setProperty property=”属性名称” name=”实例化对象的名称” value=”
属性的值” param=”参数名称”/> 

Property=”*”匹配所有的属性

使用<jsp:setProperty property=”* name=”实例化对象的名称”/> 自动将参数传入JavaBean对象
使用<jsp:setProperty property="name" name=”实例化对象的名称”/> 自动将name参数传入JavaBean对象
使用<jsp:setProperty property="name" name=”实例化对象的名称” value =“30”/> 自动将30传入name属性
<jsp:setProperty property=”name” name=”实例化对象的名称” param=”username”/> 
将参数中的username属性匹配到实例化对象的name属性

第四节:获取属性值

<jsp:getProperty property=”属性名称” name=”实例化对象的名称”/> 

第五节:JavaBean的保存范围

page,request,session,application

第六节:JavaBean的删除

作用域对象.removeAttribute(“javabean的名称”);

标签概述

JSTL核心标签库

<%@ taglib prefix="c" uri="jakarta.tags.core" %>
    <%@ taglib prefix="fmt" uri="jakarta.tags.fmt" %>
    <%@ taglib prefix="sql" uri="jakarta.tags.sql" %>
    <%@ taglib prefix="x" uri="jakarta.tags.xml" %>
    <%@ taglib prefix="fn" uri="jakarta.tags.functions" %>

c.out内容输出

<c:out value="${requestScope.aaa}" default="Man"></c:out>
如果value值为空,就输出default的属性值

Cset设置值

//设置单个值
<c:set var="a" value="a" scope=""></c:set>
//设置对象值
<c:set property="id" target="${student}" value="10"></c:set>

Cremove删除属性值

<c:remove var="" scope=""></c:remove>

C:catch处理程序异常

<c:catch var="errorMes">
     int a=1;
     int b=0;
     int c=a/b;
</c:catch>
//打印报错信息
${errorMes}

c:if条件判断

c.choose、c.when、c.otherwise联合使用,多条件判断

<c:choose>
    <c:when test="a>10"></c:when>
    <c:when test="a>5"></c:when>
    <c:otherwise>...</c:otherwise>
</c:choose>

c.forEach遍历数组、集合 c.fortokens分割输出,类似split

<c:forTokens items="${str}" delims="." var="s">
            ${s}
        </c:forTokens>

c:import导入页面类似jsp:include

<c:import url="index.jsp"></c:import>

c.url生成一个url地址

<c:url var="link" value="http://baidu.com"></c:url>
使用:
<a href="${link}">跳转</a>
加入参数:
<c:url var="link" value="http://baidu.com">
    <c:param name="name" value="a"></c:param>
    <c:param name="pass" value="ncjks"></c:param>
</c:url>

C:redirect客户端跳转

<c:redirect url="http://baidu.com"></c:redirect>

JSTL国际化标签库

fmt:setLocale设置用户所在区域

fmt:formatDate日期格式化 fmt:requestEncoding设置所有请求编码 fmt:bundlefmt:message读取国际化资源 fmt:formatNumber格式化数字

fmt:timeZone设置时区

中文日期:
<fmt:setLocalevalue="zh_CN"/>
<fmt:formatDate value="s(date}"/>
<hr/> 
英文日期:
<fmt:setLocalevalue="en_US"/>
<fmt:formatDate value="${date}"/>

<fmt:formatDate value="$(date}" pattern="yyyy-MM-dd"/>

JSTLSQL标签库

Sgl:setDataSource设置jdbc连接

Sql:query数据库查询 Sql:update数据库增删改操作

Sql:transaction事务操作

    <sql:setDataSource
        driver="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:33e6/db_jstl"
        user="root"
        password="1234">
    </sql:setDataSource>
<sql:query var="result">
	select * from t_student;
</sgl :query>
<h2>总记录数:${result.rowcount}</h2>
<c:forEach var="student" items="${result.rows}">
<tr>
	<td>
		${student.id}
	</td>
	<td>
		$(student.stuNo}
	</td> 
	<td>
		${student.stuName}
	</td> 
	<td>
		${student.birthday}
	</td>
	<td>
		${student.sex}
	</td> 
</tr>
<sql:update var="result>
insert into t_student values(null,"009","阿德托昆博","1994-1-1""男"); 
</sql:update>

第五节:JSTLXML标签库

x:parse解析xml x:out输出xml文件内容 x:Set把xml读取内容保存到指定属性范围

x:if判断指定路径的内容是否符合判断条件 x.choose、x.when、x:otherwise联合使用,多条件判断

xforEach遍历

//导入数据
<c:import var="usersInfo" url="usersInfo.xml" charEncoding="UTF-8"/> 
<x:parse var="usersInfoxmL" doc="${sersInfo}"/>
<c:importvar="usersInfo" url="usersInfo.xml" charEncoding="uTF-8"/> <x:parsevar="usersInfoXmldoc=s(usersInfo}"/>
<h2>姓名:<x:out select="$usersInfoXmL/users/user/name"/>
(ID):<x:out select="$usersInfoXmL/users/user/name/@id"/></h2)
<h2>出生日期:<x:outselect="$usersInfoXmL/users/user/birthday"/></h2>

读取的xml文件

<users>
    <user>
        <name id="n1">张三</name>
        <birthday>2011-1-1</birthday>
    </user>
</users>

set

<x:set var="userInfoXml" select="$usersInfoXmL/users/user"/)

x:if

<x:if select="susersInfoXmL/users/user/name/@id='n1'">
	<h2>有编号是n1的user信息</h2>
</xif>

多条件判断:

<x:choose>
	<x:when select="susersInfoXmL/users/user/name/@id-'n1""
		<h2>有编号是n1的user信息</h2>
	</x:when>
	<x:otherwise>I
		<h2>没有编号是n1的user信息</h2>
	</x:otherwise>
</x:choose>

x:forEach

<x:forEach select="$usersInfoXmL/users/user" var="userInfoXmL">
	<h2>
	姓名:<x:outselect="$userInfoXmL/name"/>&nbsp;
	出生日期:<x:outselect="$userInfoXmL/birthday"/>
	</h2> <hr/>
</x:forEach>

函数标签库

<h2>查找java11o位置:${fn:index0f(info,"java1010"}</h2>
<h2>判断java1010是否存在:${fn:contains(info,"java101e")}</h2>
<h2>截取:${fn:substring(info,e,5)}</h2> 
<h2>拆分:$({fn:split(info,".")[1]}</h2>

条件动作标签

​ 条件动作指令用于处理页面的输出结果依赖于某些输入值的情况,在Java中是利用if、if…else和switch语 句来进行处理的。在jsTL中也有4圣标签可以执行条件式动作指令:if、choose、when和otherwise。

if标签

​ if标签先对某个条件进行测试,如果该条件运算结果为true,则处理它的主体内容,测试结果保存在一个 Boolean对象中,并创建一个限域变量来引用Boolean对象。可以利用var属性设置限域变量名,利用scope属 性来指定其作用范围。

语法格式
<c:if test="<boolean>" var="<string>" scope="<string>"
...
</c:if> 
属性

if标签有如下属性:

属性描述是否必要默认值
test条件
var用于存储条件结果的变量(限域变量名)
scopevar属性的作用域,可取值:page | request | session |applicationpage

choose、when和otherwise标签

​ choose和when标签的作用与Java中的switch和case关键字相似,用于在众多选项中做出选择。也就是说:他们为相互排斥的条件式执行提供相关内容。 ​ switch语句中有case,而choose标签中对应有when,switch语句中有default,而choose标签中有 otherwise。

语法格式
<c:choose>
	<c:when test="<boolean>"> 
	...
	</c:when>
    <c:when test="<boolean>">
    ...
    </c:when>
    <c:otherwise> 
    ...
    </c:otherwise>
</c:choose> 
属性
  • choose标签没有属性
  • when标签只有一个test属性
  • otherwise标签没有属性

备注

1、choose标签和otherwise标签没有属性,而when标签必须有一个test属性

2、choose标签中必须包含至少一个when标签,可以没有otherwise标签

3、otherwise标签必须设置在最后一个when标签之后

4、choose标签中只能设置when标签与otherwise标签

5、when标签和otherwise标签中可以嵌套其他标签

6、otherwise标签会在所有的when标签不执行时才会执行

迭代标签

​ forEach是将一个主体内容迭代多次,或者选代一个对象集合。可以迭代的对象包括所有的 java.util.Collection和java.util.Map接口的实现,以及对象或者基本类型的数组。他还可以选代 java.util.Iterator和java.util.Enumeration,但不能在多个动作指令中使用Iterator或者Enumeration,因为 Iterator或者Enumeration都不能重置(reset)。各属性含义如下:

forEach标签

语法格式
<c:forEach 
    items="<object>"
    begin="<int>" 
    end="<int>" 
    step="<int>" 
    var="<string>"
    varstatus="<string>"
</c:forEach>
属性
属性描述是否必要默认值
items要被循环的数据
begin开始的元素(0=第一个元素,1=第二个元素)0
end最后一个元素(0=第一个元素,1=第二个元素)last element
step每一次迭代的步长1
var代表当前条目的变量名称
varStatus代表循环状态的变量名称

forEachvarstatus属性

  • index:当前这次选代从o并始的选代索引
  • count:当前这次选代从1开始的选代计数
  • first:用来表明当前这轮迭代是否为第一次代的标志
  • last:用来表明当前这轮送代是否为最后一次送代的标志
示例

1.遍历主体内容多次

<c:forEach begin="开始数” end="结束数” step="选代数” var="限域变量名">

<c:forEach>
相当于java的for循环:
for(int i=0;i<10;i++){

}

如下:

<!--遍历主体内容多次-->
<c:forEach begin="0” end"10"var="i">
标题${i}<br>
</c:forEach> 

2.循环

<c:forEach items="被循环的集合” var="限域变量名" varstatus="当前成员对象的相关信息"> 

</c:forEach>
相当于java的foreach循环:
for(string Str :1ist){

}

示例:

%%>
List<user> userList= new ArrayList<user>(); 
User user=new user(1,"zhangsan",123456")
User user2=new User(2,"1isi","123321"); 
Useruser3=newuser(3,"wangwu","654321i");
userList.add(user); 
userList.add(user2); 
userList.add(user3);//将数据设置到作用域中
request.setAttribute("userList",userList);
<c:iftest="${!empty userList}">
<tablea1ign="center"width="8oo"border="i"style="border-collapse:co1lapse;"
<tr>
<th>用户编号</th> <th>用户名称</th> <th>用户密码</th> <th>用户操作</th>
</tr>
<c:forEachitems="stuserList"var="user">
<tr align="center">

<td>suser.userId}</td> <td>s(user.uname</td> <td>$user.upwd</td> <td>
<button>修改</button> <button>删除</button>
</td>
<!--遍历Map--%>
<%
Map<string,object> map=new HashMap<string,object>();
map.put("mapl","aaa"); 
map.put("map2","bbb"); 
map.putc"map3","ccc");
pagecontext.setAttribute("map",map);
%>
<c:forEach items="${map}"var="mymap">
键:${mymap.key}值:${mymap.value}<br> 
</c:forEach>

格式化动作标签

JSTL提供了格式化和解析数字和日期的标签,我们讨论里面有:formatNumber、formatDate、 parseNumber及parseDate。

formatNumber标签

​ formatNumber标签用于格式化数字,百分比,货币。该标签用指定的格式或精度来格式化数字。 型数据转换成指定格式的字符串类型。)

语法格式

<fmt:formatNumber 
	value="<string>" 
	type="<string>" 
	var="<string>"
	scope="<string>"
/> 
属性
属性描述是否必要默认值
value要显示的数字
typeNUMBER,CURRENCY,或PERCENT类型Number
var存储格式化数字的变量Print to page
scopevar属性的作用域page

formatDate标签

​ formatDate标签用于使用不同的方式格式化日期。 (将Date型数据转换成指定格式的字符串类型。)

语法格式
<fmt:formatDate 
	value="<string>" 
	type="<string>"
	datestyle="<string>' 
	timestyle="<string>" 
	pattern="<string>" 
	timeZone-"<string>' 	
	var="<string>"
	scope="<string>"/>
属性
属性描述是否必要默认值
value要显示的日期
typeDATE、TIME,或BOTHdata
datestyleFULL,LONG,MEDIUM,SHORT,或DEFAULTdefault
timestyleFULL,ONG,MEDIUM,SHORT,或DEFAULTdefault
pattern自定义格式模式
timeZone显示日期的时区默认时区
var存储格式化日期的变量名显示在页面
scope存储格式化日志变量的范围页面

标签格式模式

代码描述实例
y不包含纪元的年份。如果不包含纪元的年份小于10,则显示不具有前导零的年份。2022
M月份数字,一位数的月份没有前导零。04
d月中的某一天。一位数的日期没有前导零20
h12小时制的小时。一位数的小时数没有前导零。12
H24小时制的小时。一位数的小时数没有前导零。0
m分钟。一位数的分钟数没有前导零。45
s秒。一位数的秒数没有前导零。52

parseNumber标签

​ parseNumber标签用来解析数字,百分数,货币。(parseNumber标签可以将数字、货币或百分比类型的 字符串转换成数值型。

语法格式
<fmt:parseNumber value-"<string>' type="<string>" var="<string>"
scope="<string>"/> 
属性
属性描述是否必要默认值
value要解析的数字Body
typeNUMBER,CURRENCY,或PERCENT类型Number
var存储待解析数字的变量Print to page
scopevar属性的作用域page

parseDate标签

​ parseDate标签用于解析日期。(将指定格式的字符串转换成Date类型。)

语法格式
 <fmt:parseDate
	value="<string>" 
	type="<string>"
    datestyle="<string>" 
    timestyle="<string>"
    pattern"<string>' 
    var="<string>"
    scope="<string>"/>
属性描述是否必要默认值
value要显示的日期
typeDATE、TIME,或BOTHdata
datestyleFULL,LONG,MEDIUM,SHORT,或DEFAULTdefault
timestyleFULL,ONG,MEDIUM,SHORT,或DEFAULTdefault
pattern自定义格式模式
timeZone显示日期的时区默认时区
var存储格式化日期的变量名显示在页面
scope存储格式化日志变量的范围页面

过滤器

介绍

​ Filter即为过滤,用于在Servlet之外对Reguest或者Response进行修改。它主要用于对用户请求进行预处 理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接看将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。在一个web应用中,可以开发编写多入Filter,这些Filter组合起来称之为一个Filter链

​ 若是一个过滤器链:先配置先执行(请求时的执行顺序);响应时:以相反的顺序执行。 ​

​ 在HttpServletReguest到达Servlet之前,拦截客户的HttpServletReguest。根据需要检查 HttpServletRequest,也可以修改HttpServletRequest头和数据。

​ 在HttpServletResponse到达客户端之前,拦截HttpServletResponse。根据需要检查 HttpServletResponse,也可以修改HttpServletResponse头和数据。

实现

​ 可以通过实现一个叫做javax.servlet.Fileter的接口来实现一个过滤器,其中定义了三个方法,init() doFilterO,destroyo分别在相应的时机执行。后期观察生命周期。 ​ Filter的实现只需要两步: ​ Step1:编写java类实现Filter接口,并实现其doFilter方法。

​ Step2:通过@WebFilter注解设置它所能拦截的资源。

@webFilter("/*")
public class Filter01 implements Filter 
    @override
    public void init(Fi1terconfig filterconfig) throws ServletException{
    ...
    }
    @override
    public voiddoFilter(servletRequestservletRequest,ServletResponse
    servletResponse,Filterchainfi1terchain)throws IoException,ServletException{
    ...
    }
    @override
    public void destroy(){
    
    }
}

重要

doFiLter()方法中需要设置放行,否清求无法到达资源(fiLterChain.doFiLter(servLetRequest,servLetResponse)

实例

请求乱码问题

用户非法访问

监听器

介绍

​ Web监听器是Servlet中一种的特殊的类,能帮助开发者监听web中的特定事件,比如ServletContext,HttpSession,ServletRequest的创建和销毁;变量的创建、销毁和修改等。可以在某些动作前后增加处理,实现监控。例如可以用来统计在线人数等。

重要

使用监听器需要注解@WebListener,同时继承监听类

其他

web.xml 完成servlet映射,如果通过这种方式写,就不用写注解WebServlet,WebFilter,WebListener,下面是使用案例

<servlet>
        <servlet-name>hello</servlet-name>
        <jsp-file>/info.jsp</jsp-file>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/info</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>fun.maluyao.javaweb.Login</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/login1</url-pattern>
    </servlet-mapping>
<filter>
        <filter-name>a</filter-name>
        <filter-class></filter-class>
    </filter>
    <filter-mapping>
        <filter-name>a</filter-name>
        <url-pattern>监听地址</url-pattern>
    </filter-mapping>
<listener>
        <listener-class>fun.maluyao.javaweb.Login</listener-class>
    </listener>

设置项目首页

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.html</welcome-file>
    ...
</welcome-file-list>

评论

评论加载中……