JSP指令


JSP指令分类
	JSP有三大指令:
		*page指令
		*include指令
		*taglib指令


	在JSP中没有任何指令是必须的。
	但基本上每个JSP都是使用page指令


============================================================


page指令
	
	page指令是最为常用的指令


		1.page指令的常用属性:
			*import:等同于import语句
				**<%@ page import="java.util.*" %
				**<%@ page import="java.util.*, java.net.*" %>
				**在一个JSP页面中可以给出多个page指令,而且import是可以重复出现的


					<%@ page import="java.util.*" %>
					<%@ page import="java.net.*" %>


			*pageEncoding:指定当前页面上的编码
				**如果pageEncoding没有指定,那么默认为contentType的值;
				**如果pageEncoding和contentType都没有指定,那么默认值为iso-8859-1


			*contentType:等同于调用response。setContentType("text/html;charset=xxx");
				**如果没有指定contentType属性,那么默认为pageEncoding的值;
				**如果contentType和pageEncoding都没有指定,那么默认值为iso-8859-1


			*errorPage:如果当前页面出现异常,那么跳转到errorPage指定的jsp页面。例如:<%@ page errorPage="a.jsp" %>


			*isErrorPage:上面示例中指定a.jsp为错误页面,但在a.jsp中不能使用内置对象exception,保有a.jsp中使用<%@ page isErrorPage="true" %>时,才能在a.sjp中使用错误页面。


			*autoFlush:当autoFlush为true时,表示out流缓冲区满时会自动刷新。默认为true


			*buffer:指定out流的缓冲区大小,默认为8kb


			*isELIgnored:当前JSP要页面是否忽略EL表达式,默认为false,表示不忽略,即支持EL表达式




		2.page指令不常用的属性:
			*language:当前JSP编译后的语言!默认为Java,当前也只有选择java


			*info:当前JSP的说明信息


			*isThreadSafe:当前JSP是否执行只能单线程访问,默认为false,表示支持访问


			*session:当前页面是否可以使用session,默认为false,表示支持session的使用。


			*extends:指定JSP真生的父类!


		3.web.xml中对jsp的配置


			<jsp-config>
				<jsp-property-group>
					<url-pattern>*.jsp</url-pattern>
					<!-- 表示对所有jsp进行配置 -->
					<el-ignored>true</el-ignored>  <!-- 忽略EL表达式 -->
					<page-encodign>UTF-8</page-encodign> <!-- 编码为utf-8 -->
					<scripting-invalid>true</scripting-invalid>  <!-- 禁用java脚本 -->
				</jsp-property-group>
			</jsp-config>





=============================================================


include指令
	语法:<%@include file="页面" %>
	include指令的作用是包含指定的页面,在jsp被编译成java文件之前会把两个jsp文件合并,然后再编译成一个java文件。


	注意:
		<%@include file="<%=mufile%>" %>
		这是不能通过编译的,因为myfile是一个变量,它的值只有在java编译成class后执行时才能确定,而include指令需要在jsp编译java时就要确定包含的是哪个页面,所以.....


============================================================


taglib指令
	taglib指令是用来在当前jsp页面中导入第三方的标签库
	<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


	prefix:指定标签前缀,这个东西可以随意起名
	uri:指定第三方标签库所需jar包放在类路径中。


=============================================================


九大内置对象


	无需在jsp中声明即可使用的9个对象
		*out(JspWriter):等同于response.getWriter(),用来向客户端发送文本数据;
		*config(ServletConfig):对应“真身”中的ServletConfig;
		*page(当前JSP的真身类型):当前JSP页面的“this”,即当前对象,引用为Object类型;
		*pageContext(PageContext):页面上下文对象,它是最后一个没讲的域对象;
		*exception(Throwable):只有在错误页面中可以使用这个对象;
		*request(HttpServletRequest):即HttpServletRequest类的对象;
		*response(HttpServletResponse):即HttpServletResponse类的对象;
		*application(ServletContext):即ServletContext类的对象;
		*session(HttpSession):即HttpSession类的对象,不是每个JSP页面中都可以使用,如果在某个jsp页面中设置<%@page session="false" %>,说明这个页面不能使用session。


pageContext对象
	pageContext对象是PageContext类型
		*域对象:只在当前jsp页面中有效的域,通常用来让jsp与当前jsp中标签之间共享数据
		*获取其他8个内置对象:可以获取其他8个内置对象
		*代理其他域对象:可以用pageContext来操作其他3个域。


===================================================================================
	
jsp动作标签
	jsp动作标签是用来替代一部分java脚本,使非java开发人员也可以向jsp中添加动态信息


---------------------------------------------------------------------


<jsp:include>
例如:<jsp:include page="xxx"/>,用来包含指定的页面。
例如在a.jsp中存在如下内容:<jsp:include page="b.jsp"/>
a.jsp和b.jsp分别编码成Servlet,然后再执行Servlet是才会包含过程。这也是include指令和include标签的区别。


注意:<jsp:include page="<%=myfile%>" />,这是可以的,因为include指令是在执行是才完成的包含,在执行时已经可以确定myfile这个变量的值。


改标签内部使用的是RequestDispatcher()方法完成的包含


--------------------------------------------------------------------------


<jsp:forward>
	例如:<jsp:forward page="xxx"/> ,用来转发到指定页面
	例如在a.jsp中存在如下内容:<jsp:forward page="b.jsp"/>
	a.jsp中的内容不会显示在浏览器上,而只是显示b.jsp的内容。而且在<jsp:forward>标签下面的内容不会被执行。


----------------------------------------------------------------------


<jsp:param>
	该标签是<jsp:include>和<jsp:forward>的子标签,用来向其他页面传递参数。
	<jsp:include page="/b.jsp">
		<jsp:param value="zhangSan" name="username"/>
	</jsp:include>
	在b.jsp中可以使用request.getParameter("username")来获取参数值。




=====================================================================================


JavaBean
	满足JavaBean规范的类就是javabean
		*必须有public的无参的构造器
		*如果成员变量提供了getter、settter方法,那么称之为javabean的属性。


	javabean主要是用来通过反射操作的类


	因为需要通过Class的newInstance()方法来创建类的实例,所以要求必须提供public的无参构造器
	因为需要通过反射来操作属性,所以需要提供getter、setter方法。


-----------------------------------------------------------------


内省
	内省依赖反射,内省比反射简化一点点,用来操作JavaBean


	把Map中的数据封装到指定类型的JavaBean中。
	已有对象:Map、Class<User>


	1.通过Class对象获取BeanInfo
	BeanInfo info = Introspector.getBeanInfo(User.class);


	2.通过BeanInfo获取所有属性描述符对象
	PropertyDescriptorp[] pds = info.getPropertyDescriptors();


	3.PropertyDescriptorp:
	*String name getName():获取当前属性的名称
	*Method getReadMethod():获取get方法反射对象
	*Method getWriteMethod():获取set方法反射对象



------------------------------------------------------------------


commons-beanutils
	beanutils比内省要简单很多,而且还要强大很多,它底层依赖内省。


	1.jar包
		commons-beanutils.jar、commons-logging.jar包


	2.通过反射设置JavaBean
		Class<User> clazz = User.class();	
		Object user = clazz.newInstance();


		BeanUtils.setProperty(user, "username", "admin");
		BeanUtils.setProperty(user, "password", "admin123");

	3.获取属性值
		String username = BeanUtils.getProperty(user, "username");


	4.把Map数据封装到JavaBean对象中
		Map<String, String> map = new HashMap<String, String>();
		map.put("username", "admin");
		map.put("password", "admin123");


		User user = new User();
		BeanUtils.populate(user, map);


		要求:map的key名称必须与User类的属性名称相同。不然无法赋值


------------------------------------------------------------------


JSP中与JavaBean相关的标签
	*<jsp:useBean>
	*<jsp:setProperty>
	*<jsp:getProperty>


	<jsp:useBean id="user1" class="com.changeyd.domain.User" />
	查看page域中是否存在user1这个域属性,如果存在,那么直接获取。
	如果不存在,那么创建


	等同于:
	User user1 = pageContext.getAttribute("user1");
	if(user1 == null){
		user1 = new User();//创建user1对象
		pageContext.setAttribute("user1", user1);//保存到page域
	}


------------------------------------------------------------------


上面是操作page域,可以通过scope属性来指定操作的域


<jsp:useBean id="user1" class="com.changeyd.domain.User" scope="page"/>
<jsp:useBean id="user2" class="com.changeyd.domain.User" scope="request"/>
<jsp:useBean id="user3" class="com.changeyd.domain.User" scope="session"/>
<jsp:useBean id="user4" class="com.changeyd.domain.User" scope="application"/>


------------------------------------------------------------------


<jsp:setProperty>
设置属性值
	<jsp:setProperty property="username" name="user1" value="admin"/>
	*name:指定名为user1的JavaBean
	*property:指定要设置的属性名称
	*value:指定要设置的属性值


	等同于:
	User user1 = (User)pageContext.getAttribute("user1");
	user1.setUsername("admin");


------------------------------------------------------------------


<jsp:getProperty>
获取属性值
	<jsp:getProperty property="username" name="user1"/>
	输出user1这个JavaBean的username的属性值


	等同于:
	User user1 = (User)pageContext.getAttribute("user1");
	out.println(uset.getUsername());


==============================================================================
==============================================================================


EL表达式
	
	EL:Expression Language,它是可以在JSP页面中直接使用的语言。
	JSP页面也可以忽略EL:<%@page isElgnored="true" %>
	EL用来代替<%= ....%>


-------------------------------------------------------------------------


格式:${....},例如:${1 + 2},会在页面上输出3


-------------------------------------------------------------------------


运算式:+ - * / % == != < > <= >= && ! | empty
${empty ""} --> 输出true,判断集合、数据、字符串长度是否为0


${null},不会输出,如果是null不会出


-------------------------------------------------------------------------


EL内置对象
	EL一共11个内置对象


	EL操作四大域的内置对象:它们是Map类型
	pageScope
	requsetScope
	sessionScope
	applicationScope


	${pageScope.user}:输出pageContext.getAttribute("user");
	${requsetScope.user}:输出requestScope.getAttribute("user");
	${sessionScope.user}:输出sessionScope.getAttribute("user");
	${applicationScope.user}:输出applicationScope.getAttribute("user");


	${user}
	依次在pageScope、requestScope、sessionScope、applicationScope中查找user
	如果查找到,那么立刻停止查找。


-----------------------------------------------------------------------------


对JavaBean的操作
对List的操作
对Map的操作


-----------------------------------------------------------------------------


操作JavaBea
	<%
		User user = new User();
		user.setUsername("zhangSan");
		user.setPassword("123");
		pageContext.setAttribute("user", user);
	 %>


	 ${pageScope.user.username}
	 ${pageScope.user.password}


-----------------------------------------------------------------------------


操作List
	<%	
		User user = new User();
		user.setUsername("zhangSan");
		user.setPassword("123");
		List list = new ArrayList();
		list.add(user);
		pageContext.setAttribute("list", list);
	%>


	${pageScope.list[0].username}
	${pageScope.list[0].password}


-----------------------------------------------------------------------------


操作Map
	<% 
		User user = new User();
		user.setUsername("zhangSan");
		user.setPassword("123");
		Map map = new HashMap();
		map.put("u1", user);


		pageContext.setAttribute("map", map);
	%>


	${pageScope.map[0].username}
	${pageScope.map[0].password}


	${pageScope.map.u1.username}
	${pageScope.map.u1.username}


-----------------------------------------------------------------------------


EL操作请求头内置对象:Map类型
	header:Map<String, String>
	headerValues:Map<String, String[]>


	${header.UserAgent}
	${headerValues.UserAgent[0]}


-----------------------------------------------------------------------------


应用初始化参数内置对象:Map类型
	initParam:Map<String, String>


	用来获取web.xml文件中的<context-param>参数,例如:


	web.xml
		<context-param>
			<param-name>p1</param-name>
			<param-value>v1</param-value>
		</context-param>	


	${initParam.p1}


-----------------------------------------------------------------------------


与Cookie相关的内置对象:Map类型
	cookie:Map<String, Cookie>,其中key是Cookie的名称,而值是Cookie对象


	${cookie.jsessionid.value}:获取sessionid


-----------------------------------------------------------------------------


pageContext内置对象:PageContext类型
	${pageContext.request},等同于pageContext.getRequest()
	${pageContext.session},等同于pageContext.getSession()


	${pageContext.request.contextpath},获取项目名
	${pageContext.session.id},获取sessionId


-----------------------------------------------------------------------------


EL中最重要的就是操作四大域




=====================================================================================
====================================================================================


EL函数库
	EL函数库,当前就是一些函数了。
	使用EL函数库需要在JSP页面中导入标签库:
		<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/function" %>


		<%@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("<html></html>")}<br/> <!-- <html></html> -->




================================================================================================
===============================================================================================


自定义函数库
	1.编写类
		类中只能有public static的方法,并且一定要有返回值


		public calss ItcastFuncations{
			public static String test(){
				return "changeyd自定义EL函数库测试";
			}
		}


	2.部署文件
		/WEB-INF/changeyd.ThreadLocal
		<?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">


				<tlid-version>1.0</tlid-version>
				<short-name>changeyd</short-name>
				<uri>http://www.changeyd.top/jsp/functions</uri>


				<function>
					<name>test</name>
					<function-class>com.changeyd.el.functions.ChangeydFuncations</function-class>
					<function-signature>String test()</function-signature>
				</function>




	3.在JSP中使用自定义
		<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
		<%@ taglib prefix="changeyd" uri="/WEB-INF/changeyd.tlid-version" %>


		<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
		<html>
			<body>
				<h1>${changeyd:test() }</h1>
			</bode>
		</html>












==============================================================================================================================
==============================================================================================================================








笔记:
	
	JSP有三大指令:
		一个jsp页面中,可以有0~N个指令的定义


	1.page --> 最复杂:<%@page language="java" info="xxx" ...%>
		*pageEncoding:他指定当前jsp页面的编码,只要不说谎,就不会有乱码!在服务器要把jsp编译成.java时需要使用pageEncoding
		*contentType:它表示添加一个响应头:Content-Type!等同于response.setConntentType("text/html;charset=utf-8");
		*如果两个属性只提供一个,那么另一个的默认值为设置哪那一个。
		*如果两个属性都没有设置,那么默认为iso-8859-1


		*import:导包,可以出多次
		*errorPage和isErrorPage
			**errorPage:当前页面如果跑出异常,那么要转发到哪一个页面,有errorPage来指定
			**isErrorPage:它指定当前页面是否为处理错误的页面!当改属性为true时,这个页面会设置状态码为500!而且这个页面可以使用9大内置对象中的exception


		*<error-page>
			<error-code>404</error-code>
			<location>/error/errorPage.jsp</location>
		 </error-page>4
		 <error-page>
		 	<error-code>500</error-code>
			<location>/error/errorPage.jsp</location>
		 </error-page>
		 <error-page>
		 	<exception-type>java.lang.RuntimeException</exception>
		 	<location>/index.jsp</location>
		 </error-page>


		*autoFlush和buffer
			**autoFlush:指定jsp的输出流缓冲区满时,是否自动刷新!默认为true,如果为false,那么在缓冲区满时抛出异常
			**buffer:指定缓冲区大小,默认为8kb,通常不需要修改


		*isELIgnored:是否忽略el表达式,默认值为false,不忽略,即支持!


		*基本没有:
			**language:是否当前jsp编译后的语言类型,默认值为java。
			**info:信息
			**isThreadSafe:当前的jsp是否支持并发访问!
			**session:当前页面是否支持session,如果为false,那么当前页面就没有session这个内置对象!
			**extents:让jsp生成的servlet去继承该属性指定的类


	2.include --> 静态包含
		*与RequestDispatcher的include()方法的功能相似


		*<%@include%> 它是在jsp编译成java文件时完成的!她们共同生成一个java(就是一个servlet)文件,然后再生成一个class


		*RequestDispatcher的include()是一个方法,包含和被包含的是两个servlet,即两个.class!他们只是把响应的内容在运行时合并了!


		*作用:把页面分解了,使用包含的方式组合到一起,这样一个页面中不变的部分,就是一个独立的jsp,而我们只需要处理变化的页面。


	3.taglib --> 导入标签库
		*两个属性:
			**prefix:指定标签库在本页面中的前缀!由我们自己来起名称!
			**uri:指定标签库的位置
			**<%@taglib prefix="s" uri="/struts-tags"%> 前缀的用法<s:text>




=======================================================================================================================
=======================================================================================================================




九个内置对象
	*out --> jsp的输出流,用来向客户端响应
	*page --> 当前jsp对象,它的引用类型是Object,即真身中有如下代码:Object page = this;
	*config --> 它对应真身中的ServletConfig对象。
	*pageContext --> 一个顶9个。
	*request --> HttpServletRequset
	*response --> HttpServletResponse
	*exception --> Throwable
	*session --> HttpSession
	*application --> ServletContext


1.pageCOntext
	*一个顶9个!
	*Servelt中有三大域,而JSP中有四大域,它就是最后一个域对象。
		**ServletContext:整个应用程序
		**session:整个会话(一个会话中只有一个用户)
		**request:一个请求链
		**pageContext:一个jsp页面,这个域是在当前jsp页面和当前jsp页面中使用的标签之间共享数据
			***域对象
			***代理其他域:pageContext。setAttribute("xxx", "XXX", pageContext.SESSION_SCOPE);
			***全域查找:pageContext.findAttribute("xxx");从小到大,依赖查找!
			***获取其他8个内置对象;


=========================================================================================


jsp动作标签
	这些jsp的动作标签,与html提供的标签有本质的区别。
	
	*动作标签是由tomcat来解释执行,它与Java代码一样,都是在服务器端执行的。
	
	*html由浏览器来执行。


	*<jsp:forward>:转发,它与RequsetDispatcher的forward方法是一样的,一个是在Servlet中使用,一个是在jsp中使用


	*<jsp:include>:包含:它与RequsetDispatcher的include方法是一样的,一个是在Servlet中使用,一个是在jsp中使用
		**<%@include %>和<jsp:include>有什么不同


	*<jsp:param>:它用来作为forward和include的子标签,用来给转发或包含的页面传递参数


========================================================================================


JavaBean
	
	javabean的规范:
		1.必须要有一个默认构造器
		2.提供get/set方法,如果只有get方法,那么这个属性是只读属性
		3.属性:有get/set方法的成员,还可以没有成员,只有get/set方法。属性名称由get/set方法来决定,而不是成员名称。
		4.方法名称满足一定的规范,那么它就是属性!boolean类型的属性,它的读方法可以是is开头,也可以是get开头。




内省:
	内省类 --> Bean信息 --> 属性描述符 --> 属性的get/set对应的Method --> 可以进行反射了


----------------------------------------------------------------------------


commons-beanutils,它是依赖内省完成的
	*导包:
		**commons-beanutils.jar
		**commons-logging.jar


BeanUtils.getProperty(Object bean, String propertyName)
BeanUtils.setProperty(Object bean, String propertyName, String propertyValue)
BeanUtils.populate(Map map, Object bean)


CommontUtils.toBean(Map map, Class clazz)


----------------------------------------------------------------------------


JSP中与JavaBean相关的标签	
	*<jsp:useBean> --> 创建或查询bean
		*<jsp:useBean id="user1" class="com.changeyd.domain.User" scope="session" />
			在session域中查找名为user1的bean,如果不存在,创建之


		*<jsp:useBean id="user1" class="com.changeyd.domain.User" scope="session" />


	*<jsp:setProperty>
		*<jsp:setProperty property="username" name="user1" value="admin" />
			设置名为user1这个javabean的username属性值为admin


	*<jsp:getProperty>
		*<jsp:getProperty property="username" name="user1"
			获取名为user1的javabean的名为username属性值


==========================================================================================




EL表达式
	1.EL是jsp内置的表达式语言:
		*jsp2.0开始,不让再使用Java脚本,而是使用el表达式和动态标签来替代java脚本


		*EL替代的是<%=...%>,也就是说,EL只能做输出


	2.EL表达式来读取四大域
		*${xxx},全域查找名为xxx的属性,如果不存在,输出空字符串,而不是null。
		*${pageScope.xxx}、${requsetScope.xxx}、${sessionScope.xxx}、${applicationScope.xxx},指定域获取属性


	3.javabean导航
		<%
			Address address = new Address();
			address.setCity("江西");
			address。serSalary("九江");


			Employee emp = new Employee();
			emp.setName("李小四");
			emp.setSalary(123456);
			emp.setAddress(address);


			request.setAttribute("emp", emp);
		%>


		<h3>使用el获取request域的emp</h3>
		${requsetScope.emp.address.street} <!-- requset.getAttribute("emp").getAddress().getStreet() --><br/>


	4.EL可以输出的东西都在11个内置对象中,11个内置对象,其中10个是Map,pageContext不是Map,它就是PageContext类型,1个项9个。
		*我们已经学了四个
		*param:对应参数,它是一个Map,其中key参数名,value是参数值,适用于单值的参数。
		*paramValues:对应参数,它是一个Map,其中key表示头名称,value是单个头值,使用于单值请求头
		*header:对应请求头,它是一个Map,其中key表示头名称,value是多个头值,适用于多值请求头
		*initParam:获取<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的name,value是cookie对象。
		${cookie.username.value}


		*pageContext:它是PageContext类型,${pageContext.request.contextPath}




===============================================================================================


EL函数库(由JSTL提供的)
	*导入标签库:<%@ tablib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>


		**String toUpperCase(String input):把参数转换成大写


		**String toLowerCase(String input):把参数转换成小写


		**int indexOf(String input, String substring):从大串,输出小串的位置!


		**boolean contains(String input, String substring):查看大串中是否包含小串


		**boolean containsIgnoreCase(String input, String substring):忽略大小写的,是否包含


		**boolean startsWith(String input, String substring):是否以小串为前缀


		**boolean endsWith(String input, String substring):是否以小串为后缀


		**String substring(String input, int beginIndex, int endIndex):截取子串


		**String substringAfter(String input, String substring):获取大串中,小串所在位置后面的字符串


		**substringBefore(String input, String substring):获取大串中,小串所在位置前面的字符串


		**String escapeXml(String input):把input中"<"、">"、"&"、"'"、"\"",进行转义


		**String trim(String input):去除前后空格


		**String replace(String input, String substringBefore, String substringAfter):替换


		**String[] split(String input, String delimiters):分割字符串,得到字符串数组


		**int length(Object obj):可以获取字符串、数组、各种集合的长度!


		**String join(String array[], String separator):联合字符串数组!


===============================================================================================


自定义函数库
	*写一个Java类,类中可以定义0~N个方法,但是必须是static,而且有返回值的。


	*在WEB-INF目录下创建一个tld文件
		<function>
			<name>fun</name>
			<function-class>com.changeyd.fn.MyFunction</function-class>
			<function-signature>java.lang.String fun()</function-signature>
		</function>


	*在jsp页面中导入标签库
		<%@ taglib prefix="changeyd" uri="/WEB-INF/tlds/changeyd.tlds" %>


	*在jsp页面中使用自定义的函数:${it:fun() }