JSP指令
1.概述
JSP有三大指令:page、include、taglib
JSP指令格式:<%@指令名 attr1=" " attr2=" "%>
2.page指令
(1)属性名
①pageEncoding:指定当前JSP页面的编码(服务器会将该页面编译为java文件时使用该编码)
②contentType:设置content=type响应头、设置响应字符流的编码。<%@page contentType="text/html;charset=utf-8"%>
以上两个属性,任意只设置其中一个,另一个都会默认和设置编码相同。若都不设置则默认为ISO编码
③import:导包
④errorPage:当前页面抛出异常,跳转到errorPage设置的页面上(转发)
⑤isErrorPage:设置当前页面是否为处理错误页面,若为true,会将状态码码设置为500,并且可以使用九大内置对象exception
只有isErrorPage设置为true时,该jsp才能使用exception,因此不是所有jsp页面都可以使用九大内置对象exception
除此以外,还可以通过web.xml中配置错误页面
<error-page>
<error-code>404</error-code>
<location>/error404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error500.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.RuntimeException</exception-type>
<location>/error.jsp</location>
</error-page>
⑥autoFlush:指定jsp缓冲区满时,是否自动刷新。默认为true,如果设置为false,当缓冲区满时就会抛出异常
⑦buffer:指定缓冲区大小,默认为8kb,通常不需要修改
⑧isELIgnored:是否忽略EL表达式,默认值为false
(2)include:静态包含
静态include和请求包含RquestDispatcher的include()方法中不同的是,
静态include是两个jsp页面合为一个页面后共同编译为一个java文件(Servlet),最后编译为.class文件
后者则是将两个Servlet的响应结合为一个响应发送给客户端
静态include作用:将一个jsp页面分解为多个页面,分别保存不同的信息,然后通过include组合在一起,这样可以将一个页面中不变的部分,变成一个独立的jsp,或者可以用一个jsp页面写繁琐的jsp代码,然后直接使用include放入另一个主要的jsp页面中。
(3)taglib:导入标签库
>prefix:设置标签库在本页面中使用的前缀名称
>uri:指定标签库位置
3.JSP九大内置对象
(1)九大内置对象
①out:等同于response.getWriter(),用来向客户端发送文本数据
②config
③page:当前jsp页面的"this",也就是当前对象
④pageContext(****):页面上下文对象,域对象
⑤exception:旨在错误页面中可以使用该对象
⑥request
⑦response
⑧session
(2)pageContext:
考虑到域,其自然会有getAttribute,setAttribute,moveArrribute三个方法,并且还需要考虑到每个域的范围
Servlet中有三大域,JSP中有四大域
Servlet:
>ServletContext:用于整个应用程序
>session:整个会话(一个会话中只有一个用户,浏览器关闭则会话结束)
>request:一个请求链
>pageContext:一个JSP页面。该域是jsp页面中使用的标签之间共享的数据
pageContext功能:①可以获取其他域中的数据(因为可以获取内置对象) ②可以获取当前jsp中的九大内置对象 ③可以全域查找数据,从小范围的域中查起(****)
3.JSP动作标签
JSP动作标签和HTML标签有本质区别:
①JSP动作标签的解析是通过服务器,就如Servlet本质是java文件,由服务器进行解析
②HTML标签的解析是由浏览器进行解析
JSP动作标签的作用:
举例子:<jsp:forword>的作用就是Servlet中请求转发forword()的作用
<jsp:include>的作用就是Servlet中请求包含include()的作用
因此会有问<%@ include%>和<jsp:include>的区别
其区别就在于前者是静态包含,是将两个jsp文件结合为一个java文件在进行编译为.class文件
后者是动态包含,是将两个jsp文件编译为两个java文件进而编译为两个.class文件之后将响应结合发送给服务器
<jsp:param name="" value="">用来向传递被转发或者被包含页面的参数
4.JavaBean
(1)JavaBean规范
①必须要有默认构造器
②所有成员变量都提供了对应的get/set方法,当只有get方法时成为只读属性。
(成员变量和属性时是两个事物)
③属性:有get/set方法的成员,还可以没有成员,只有get,set方法,属性名称由get/set方法来决定,而不是成员变量决定。
(2)Introspector(称为内省)
其主要是为了能够得到JavaBean属性读写方法的反射对象,通过反射对JavaBean属性进行读写操作的一组API。
举例:向Map中put两组键值对:
Map<String,String> map = new HashMap<String,String>();
map.put("username","admin");
map.put("password","961020");
public class User {
private String username;
private String password;
public Person() {
super();
// TODO Auto-generated constructor stub
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
如果此时想要将map中的数据封装到User对象(JavaBean)中,此时可以使用内省,通过内省中的API对User对象中的属性进行写操作。和反射不同的是,反射可以直接获得User的属性,但考虑到其为私有,就会产生安全性问题,所以相对不可靠。如果使用内省,就可以通过get set方法对User对象进行操作。
①通过内省获得JavaBean的信息对象: BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
②通过BeanInfo获得属性描述符(PropertyDescriptor).可以通过BeanInfo获得JavaBean的所有属性的PropertyDescriptor对象
③通过PropertyDescriptor对象获得属性的getter/setter方法的method对象
>每个PropertyDescriptor对象都对应一个JavaBean属性;
>String getName():获取JavaBean属性名称
>Method getReadMethod:获取属性的读方法
>Method getWriterMethod:获取属性的写方法
④完成Map数据封装到User对象中
public void fun1() throws Exception {
Map<String,String> map = new HashMap<String,String>();
map.put("username", "admin");
map.put("password", "admin123");
BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
User user = new User();
for(PropertyDescriptor pd : pds) {
String name = pd.getName();
String value = map.get(name);
if(value != null) {
Method writeMethod = pd.getWriteMethod();
writeMethod.invoke(user, value);
}
}
System.out.println(user);
}
(3)commons-beanutils
①设置JavaBean属性
User user = new User();
BeanUtils.setProperty(user, "username", "admin");
BeanUtils.setProperty(user, "password", "admin123");
System.out.println(user);
②获取JavaBean属性
User user = new User("admin", "admin123");
String username = BeanUtils.getProperty(user, "username");
String password = BeanUtils.getProperty(user, "password");
System.out.println("username=" + username + ", password=" + password);
③封装Map数据到JavaBean中(直接将整个Map中的键值对数据放到User对象中)
Map<String,String> map = new HashMap<String,String>();
map.put("username", "admin");
map.put("password", "admin123");
User user = new User();
BeanUtils.populate(user, map);
System.out.println(user);
以后可以使用BeanUtils将表单中的数据一句封装到JavaBean中。
(4)jsp中与javaBean相关标签
<jsp:useBean>:创建或查询javaBean
<jsp:setProperty>
<jsp:getProperty>
<jsp:useBean id="user1" class="cn.itcast.domain.User" />
<jsp:useBean id="user1" class="cn.itcast.domain.User" scope="page"/>
<jsp:useBean id="user2" class="cn.itcast.domain.User" scope="request"/>
<jsp:useBean id="user3" class="cn.itcast.domain.User" scope="session"/>
<jsp:useBean id="user4" class="cn.itcast.domain.User" scope="applicatioin"/>
<jsp:useBean id="user1" class="cn.itcast.domain.User" />
<jsp:setProperty property="username" name="user1" value="admin"/>
<jsp:setProperty property="password" name="user1" value="admin123"/>
用户名:<jsp:getProperty property="username" name="user1"/><br/>
密 码:<jsp:getProperty property="password" name="user1"/><br/>
5.EL表达式
(1)EL概述
JSP2.0要将html和css分离、要把html和javasript分离、要把Java脚本换成EL,也就是不包含<%%>
,EL是一门表达式语言,它对应<%=...%>,在jsp中,表达式会被输出,所以EL表达式也会被输出
(2)格式:${...}
(3)11个内置对象
①param:对应参数,它是一个map,其中key为参数名,value是参数值,适用于单值
②paramValues:Map<String,String[]>,即适用多值
③header:对应请求头,是一个Map,key为请求头名称,value是请求头对应的值,适用于单值
④headerValues:适用于多值
⑤initParam:获取<context-param>内的参数
其中<context-param>是用来设置参数名称和参数值,例如
<context-param>
<param-name>xxx</param-name>
<param-value>XXX</param=value>
</context-param>
<context-param>
<param-name>yyy</param-name>
<param-value>YYY</param=value>
</context-param>
可以通过${initParam.xxx}来获取相应的参数值
⑥cookie:Map<String,cookie>,key为cookie的名称,value为cookie对象
⑦pageContext为pageContext的类型
${pageContext.request.contextPath }:获取当前项目名称
6.EL函数库
(2)自定义EL函数
①写一个自定义函数
②创建.tld文件,将文件放在/WEB-INF文件下
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>itcast</short-name>
<uri>http://www.itcast.cn/jsp/functions</uri>
<function>
<name>test</name>
<function-class>cn.itcast.el.funcations.ItcastFuncations</function-class>
<function-signature>String test()</function-signature>
</function>
</taglib>
③在jsp页面中添加taglib指令,导入自定义标签库
④使用EL语句:${itcast:test() }访问自定义类中的方法
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="itcast" uri="/WEB-INF/itcast.tld" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
<h1>${itcast:test() }</h1>
</body>
</html>