page 最复杂
include 静态包含
taglib 导入标签库
pageEncoding和contentType:
<error-page>
<error-code>404error-code>
<location>/error/errorPage.jsplocation>
error-page>
<error-page>
<error-code>500error-code>
<location>/error/errorPage.jsplocation>
error-page>
<error-page>
<exception-type>java.lang.RuntimeExceptionexception-type>
<location>/index.jsplocation>
error-page>
基本不使用:
autoFlush和buffer
autoFlush:指定jsp的输出流缓冲区满时,是否自动刷新!默认为true,如果为false,那么在缓冲区满时抛出异常
buffer:指定缓冲区大小,默认为8kb,通常不需要修改
isELIgnored:是否忽略el表达式,默认值为false,不忽略,即支持
language:指定当前jsp编译后的语言类型,默认值为java。
info:信息
isThreadSafe:当前的jsp是否支持并发访问
session:当前页面是否支持session,如果为false,那么当前页面就没有session这个内置对象
extends:让jsp生成的servlet去继承该属性指定的类
include:静态包含
<%@include%>
它是在jsp编译成java文件时完成的,他们共同生成一个java(就是一个servlet)文件,然后再生成一个class;taglib:导入标签库
两个属性:
<%@taglib prefix="s" uri="/struts-tags"%>
out
:jsp的输出流,用来向客户端响应page
:当前jsp对象。它的引用类型是Object,即真身中有如下代码:Object page = this;config
:它对应真身中的ServletConfig对象!pageContext
:一个顶9个!request
:HttpServletEequestresponse
:HttpServletResponseexception
:Throwablesession
:HttpSessionapplication
:ServletContext在JavaWeb中一共四个域对象,其中Servlet中可以使用的是request、session、application三个对象,而在JSP中可以使用pageContext、request、session、application四个域对象。
pageContext 对象是PageContext类型,它的主要功能有:
getAttribute(name,value)
、setAttribute(name,value)
、removeAttribute(name,value)
pageContext.setAttribute("x", "X");
pageContext.setAttribute("x", "XX", PageContext.REQUEST_SCOPE);
pageContext.setAttribute("x", "XXX", PageContext.SESSION_SCOPE);
pageContext.setAttribute("x", "XXXX", PageContext.APPLICATION_SCOPE);
void setAttribute(String name, Object value, int scope)
:在指定范围中添加数据;
Object getAttribute(String name, int scope)
:获取指定范围的数据;
void removeAttribute(String name, int scope)
:移除指定范围的数据;
Object findAttribute(String name)
:依次在page、request、session、application范围查找名称为name的数据,如果找到就停止查找。这说明在这个范围内有相同名称的数据,那么page范围的优先级最高!
动作标签的作用是用来简化Java脚本的。JSP动作标签是JavaWeb内置的动作标签,它们是已经定义好的动作标签,我们可以拿来直接使用。
:转发:它与RequestDispatcher的forward方法是一样的,一个是在Servlet中使用,一个是在jsp中使用
:包含:它与RequestDispatcher的include方法是一样的,一个是在Servlet中使用,一个是在jsp中使用<%@include>
和
有什么不同: <%@include>
是静态包含,只生成一个.java文件;
是动态包含,实际只是调用了另一个servlet,生成两个.java文件
:作为forward和include的子标签,用来给转发或包含的页面传递参数<jsp:forward page="b.jsp">
<jsp:param value="zhangsan" name="username">
<jsp:param value="123" name="password">
jsp:forward>
b.jsp
<%
String username=request.getParameter("username");
String username=request.getParameter("password");
out.print(username+","+password);
%>
规范:
//该例中User类有一个成员变量:username(而非hello)。也就是说成员变量的名称取决于get/set方法名。
public class User {
private String hello;
public String getUsername() {
return hello;
}
public void setUsername(String username) {
this.hello = username;
}
}
内省的目标是得到JavaBean属性的读、写方法的反射对象,通过反射对JavaBean属性进行操作。内省依赖于反射。
演示:把Map数据封装到User
BeanInfo beanInfo = Introspector.getBeanInfo(User.class);//1.获取BeanInfo实例
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();//2.得到所有属性描述符对象
User user = new User();
for(PropertyDescriptor pd : pds) {
String name = pd.getName();//获取javabean属性名
String value = map.get(name);//获取属性名对应值
if(value != null) {
Method writeMethod = pd.getWriteMethod();//3.获取写方法
writeMethod.invoke(user, value);//4.把Map的值写入User对象对应的属性中
}
}
实际开发中,使用commons-beanutils这个工具。这个工具依赖于内省。
User user = new User();
//这里少赋值则为null,多赋值则不存入。都不会抛异常。
BeanUtils.setProperty(user, "username", "admin");
BeanUtils.setProperty(user, "password", "admin123");
System.out.println(user);
对于上面map的例子,则可以变为:
Use user=new User();
BeanUtils.populate(user,map);//要求map的key与bean的属性名相同
这里可以写一个自己的方法:
public static <T> T toBean(Map map,Class<T> clazz){
try{
T bean=clazz.newInstance();
BeanUtils.populate(bean,map);
return bean;
}
catch(Exception e){
throw new RuntimeException(e);
}
}
则可以迅速存储表单数据:
request.getParameterMap();
User user=CommonUtils.toBean(map,User.class);
:创建JavaBean对象;
:设置JavaBean属性;
:获取JavaBean属性;EL(Expression Language)是一门表达式语言,它对应<%=…%>
,也就是说EL只能做输出。格式${...}
。
${xxx}
${pageScope.xxx}
、${requestScope.xxx}
、${sessionScope.xxx}
、${applicationScope.xxx}
,从指定域获取属性${requestScope.emp.address.street}
获取属性11个内置对象:pageScope requestScope sessionScope param paramValues header headerValues initParam cookie pageContext
域相关内置对象:
pageScope:${pageScope.name}
等同与pageContext.getAttribute(“name”);
requestScope:${requestScope.name}
等同与request.getAttribute(“name”);
sessionScoep: ${sessionScope.name}
等同与session.getAttribute(“name”);
applicationScope:${applicationScope.name}
等同与application.getAttribute(“name”);
请求参数相关内置对象:
应用初始化参数相关内置对象
initParam:initParam是Map
Cookie相关内置对象
cookie:cookie是Map
pageContext对象
pageContext:pageContext是PageContext类型。可以使用pageContext对象调用getXXX()方法,例如pageContext.getRequest(),可以${pageContext.request}。也就是读取JavaBean属性
是由JSTL提供的。
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
…
String[] strs = {"a", "b","c"};
List list = new ArrayList();
list.add("a");
pageContext.setAttribute("arr", strs);
pageContext.setAttribute("list", list);
%>
${fn:length(arr) }<br/><!--3-->
${fn:length(list) }<br/><!--1-->
${fn:toLowerCase("Hello") }<br/> <!-- hello -->
${fn:toUpperCase("Hello") }<br/> <!-- HELLO -->
${fn:contains("abc", "a")}<br/><!-- true -->
${fn:containsIgnoreCase("abc", "Ab")}<br/><!-- true -->
${fn:contains(arr, "a")}<br/><!-- true -->
${fn:containsIgnoreCase(list, "A")}<br/><!-- true -->
${fn:endsWith("Hello.java", ".java")}<br/><!-- true -->
${fn:startsWith("Hello.java", "Hell")}<br/><!-- true -->
${fn:indexOf("Hello-World", "-")}<br/><!-- 5 -->
${fn:join(arr, ";")}<br/><!-- a;b;c -->
${fn:replace("Hello-World", "-", "+")}<br/><!-- Hello+World -->
${fn:join(fn:split("a;b;c;", ";"), "-")}<br/><!-- a-b-c -->
${fn:substring("0123456789", 6, 9)}<br/><!-- 678 -->
${fn:substring("0123456789", 5, -1)}<br/><!-- 56789 -->
${fn:substringAfter("Hello-World", "-")}<br/><!-- World -->
${fn:substringBefore("Hello-World", "-")}<br/><!-- Hello -->
${fn:trim(" a b c ")}<br/><!-- a b c -->
${fn:escapeXml("")}<br/> <!-- <html></html> -->
自定义函数库
<function>
<name>funname>
<function-class>cn.itcast.fn.MyFunctionfunction-class>
<function-signature>java.lang.String fun()function-signature>
function>
在fn文件夹下创建jsp文件,并导入:
<%@ taglib prefix="it" uri="/WEB-INF/tlds/itcast.tld" %>
是对EL表达式的扩展(也就是说JSTL依赖于EL)。JSTL是标签语言。
<%@taglib prefix="c" uri=“http://java.sun.com/jsp/jstl/core” %>
:输出
value:可以是字符串常量,也可以是EL表达式
default:当要输出的内容为null时,会输出default指定的值
escapeXml:默认值为true,表示转义
举例 | 作用 |
---|---|
输出aaa字符串常量 | |
与${aaa}相同 | |
当${aaa}不存在时,输出xxx字符串 | |
<%request.setAttribute(“a”,“”);%> |
当escapeXml为false,不会转换“<”、“>”。这可能会受到JavaScript攻击。 |
:设置(创建域的属性)
var:变量名
value:变量值,可以是EL表达式
scope:域,默认为page,可选值:page、request、session、application
举例 | 作用 |
---|---|
在pageContext中添加name为a,value为hello的数据。 | |
在session中添加name为a,value为hello的数据。 |
:移除
var:变量名
scope:如果不给出scope,表示删除所有域中的该名称的变量;如果指定了域,那么只删除该域的变量。
删除所有域中name为a的数据
<%
pageContext.setAttribute("a", "pageContext");
request.setAttribute("a", "session");
session.setAttribute("a", "session");
application.setAttribute("a", "application");
%>
<c:remove var="a"/>
<c:out value="${a }" default="none"/>
删除pageContext中name为a的数据
<c:remove var="a" scope=”page”/>
url
,它会输出/day13_1/index.jsp
,用来给url后面添加参数,例如: <c:url value="/index.jsp">
<c:param name="username" value="张三"/> (-->可以对参数进行url编码)
c:url>
结果为:/day13_1/index.jsp?username=%ED%2C%3F%ED%2C%3F
var
:指定变量名,一旦添加了这个属性,那么url标签就不会再输出到页面,而是把生成url保存到域中。scope
:它与var一起使用,用来保存url。在这里,c:url标签在服务器端处理,
到达浏览器的时候已经是地址了
<a href="' /index.jsp'>">回到主页a>
if
:对应java中的if语句
,当test为真时,执行标签体内容
choose
:它对应java中的if/else if/ … /else
<c:choose>
<c:when test="">...c:when>
<c:when test="">...c:when>
<c:when test="">...c:when>
...
<c:otherwise> ...c:otherwise>
c:choose>
等同于
if(...) {
} else if( ....) {
} else if( ....) {
} else if( ....) {
} ...
else { ...}
forEach
它用来循环遍历数组、集合;还可以用来计数方式来循环
用来输出数组、集合:
<c:forEach items="${strs }" var="str">
${str }<br/>
c:forEach>
等同于:
for(String str : strs) {
...
}
属性:
计数方式:
<c:forEach var="i" begin="1" end="10">
${i}
c:forEach>
等同于:
for(int i = 1; i <= 10; i++) {
...
}
属性:
循环状态:使用varStatus来创建循环状态变量
属性:
<c:forEach items="${list }" var="ele" varStatus="vs">
${vs.index} ${vs.count } ${vs.first } ${vs.last } ${vs.current }<br/>
c:forEach>