使用这两个工具包commons-beanutils-1.8.3 commons-logging-1.1.1
Person类
package cn.itcast.domain;
/*
* javaBean 必须为成员提供get或set方法
* 必须要有一个默认构造器(没参的)
* 一般对于具有get/set方法的成员变量 称之为属性
*
* 其实就算一个属性没有对应的成员变量,只有get/set方法也可以
* 属性的名称就是get/set方法去除get/set后 ,再把首字母小写
* boolean的方法可以是is开头
*/
public class Person {
private int age;
private String name;
private String gender;
private boolean bool;
public boolean isBool() {
return bool;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Person [age=" + age + ", name=" + name + ", gender=" + gender
+ "]";
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(int age, String name, String gender) {
super();
this.age = age;
this.name = name;
this.gender = gender;
}
}
demo1
package cn.itcast.domain;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
import org.junit.Test;
import cn.itcast.utils.CommonUtils;
public class Demo1 {
@Test
public void fun() throws InstantiationException, IllegalAccessException, ClassNotFoundException, InvocationTargetException, NoSuchMethodException{
String className = "cn.itcast.domain.Person";
Class clazz = Class.forName(className);
Object bean = clazz.newInstance();
BeanUtils.setProperty(bean, "name", "张三");
BeanUtils.setProperty(bean, "age", "23");
BeanUtils.setProperty(bean, "gender", "男");
BeanUtils.setProperty(bean, "xxx", "xxx"); //因为person类没有xxx属性 所以会自动忽略
String ageString=BeanUtils.getProperty(bean,"age");
System.out.println(ageString);
System.out.println(bean);
}
/*
* fun2和fun3一样 fun3自己写了一个工具类
* 把map中的属性直接封装到一个bean中
* Map:("username":"zhangSan","password","123")
* 我们要把map的数据封装到一个javaBean中 要求map的key与bean的属性名相同
*/
@Test
public void fun2() throws IllegalAccessException, InvocationTargetException{
Map<String,String> map = new HashMap<String,String>();
map.put("username","name");
map.put("password", "123");
User user = new User();
BeanUtils.populate(user,map);
System.out.println(user);
}
@Test
public void fun3(){
Map<String,String> map = new HashMap<String,String>();
map.put("username","name");
map.put("password", "123");
//使用自己写的工具类
User user = CommonUtils.toBean(map, User.class);
System.out.println(user);
// request.getParameter("username");
// request.getParamterMap();
}
}
fun1结果
fun2结果
顺手丢个工具类在这里
package cn.itcast.utils;
import java.util.Map;
import java.util.UUID;
import org.apache.commons.beanutils.BeanUtils;
public class CommonUtils {
// ALT + SHIFT + J 自动会生成上述方法注释的格式
/**
* 生成不重复的32位长的大写字符串
* @return
*/
public static String uuid() {
return UUID.randomUUID().toString().toUpperCase();
}
/**
* 把map转换成指定类型的javaBean对象
* @param map
* @param clazz
* @return
*/
public static <T>T toBean(Map map,Class<T> clazz) {
try {
// 1.创建指定类型的javaBean对象
T bean = clazz.newInstance();
//把数据封装到javaBean中
BeanUtils.populate(bean, map);
//3.返回javaBean对象
return bean;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
jsp中与javaBean相关的标签!
* <jsp:useBean> --> 创建或查询bean
* <jsp:useBean id="user1" class="cn.itcast.domain.User" scope="session"/> 在session域中查找名为user1的bean,如果不存在,创建之
* <jsp:useBean id="user1" class="cn.itcast.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表达式
EL替代的是<%= ... %>,也就是说,EL只能做输出!
EL表达式来读取四大域
* ${xxx},全域查找名为xxx的属性,如果不存在,输出空字符串,而不是null。
* ${pageScope.xxx}、${requestScope.xxx}、${sessionScope.xxx}、${applicationScope.xxx},指定域获取属性!
<body>
<%
//依次序注释会输出pageContext,request,然后是session,然后如果不关闭浏览器 就继续session咯
pageContext.setAttribute("xxx", "pageContext_XXXX");
request.setAttribute("xxx", "request_XXX");
session.setAttribute("xxx","session_XXX");
application.setAttribute("xxx", "application_XXX");
%>
<!-- EL只能做输出跟%=一样 -->
<!-- 全域查找名为xxx的属性 不存在就输出空字符串"" 而不是null -->
${ xxx }<br/>
<!-- 指定域查找 -->
${pageScope.xxx} <br/>
${requestScope.xxx}<br/>
${sessionScope.xxx} <br/>
${applicationScope.xxx }<br/>
</body>
javaBean导航
<%
Address address = new Address();
address.setCity("北京");
address.setStreet("西三旗");
Employee emp = new Employee();
emp.setName("李小四");
emp.setSalary(123456);
emp.setAddress(address);
request.setAttribute("emp", emp);
%>
<body>
<%-- map.key这是el的语法!
map['key']也可以操作map
--%>
${param.username }<br/>
${paramValues.hobby[0] }
${paramValues.hobby[1] }
</body>
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):联合字符串数组!
DEMO
<%@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> -->
自定义函数库
* 写一个java类,类中可以定义0~N个方法,但必须是static,而且有返回值的!* 在WEB-INF目录下创建一个tld文件
<function>
<name>fun</name>
<function-class>cn.itcast.fn.MyFunction</function-class>
<function-signature>java.lang.String fun()</function-signature>
</function>
***itcast.tld(开头这里可以去tomcat目录WEB-INF/libs/jstl-impl-1.2.2.jar借,用zip打开看到fn.tld 然后<taglib>到<uri>最后自己补一个</taglib>)
<?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">
<description>itcast</description>
<display-name>itcast-functions</display-name>
<tlib-version>1.0</tlib-version>
<short-name>it</short-name>
<uri>http://itcast.cn/el/functions</uri>
<function>
<name>fun</name>
<function-class>cn.itcast.fn.MyFunction</function-class>
<function-signature>java.lang.String fun()</function-signature>
</function>
</taglib>
*然后在在jsp页面中导入标签库
<%@ taglib prefix="it" uri="/WEB-INF/tlds/itcast.tld" %>
* 在jsp页面中使用自定义的函数:${it:fun() }
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="it" uri="/WEB-INF/tlds/itcast.tld" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'b.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<h1>${it:fun()}</h1>
</body>
</html>