.jsp (第一次访问jsp的时候)======> .java ======> .class(servlet)
.jsp编译成.java文件和.class文件在tomcat的 work目录下.<%=%>: 输出, 写在该脚本中的代码,最后会出现在service方法 中,并以 out.print(); 包裹.
: html注释,将html代码发送给浏览器之后,给浏览器看的.
taglib 引入标签指令
注意:JSP中不要直接使用response.getWriter.
pageContext.getPage();
JAVA BEAN
就是在写法上符合以下格式即可成为java bean我们也可以注册一个转换器,让BeanUtils可以转换其他类型
package com.jyh.bean;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;
public class AServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
User u1 = new User();
User u2 = new User();
User2 u3 = new User2();
//自己通过使用内省封装参数.
populate(request.getParameterMap(), u2);
//使用BeanUtils包进行封装
try {
//注册一个转换器,告诉BeanUtils遇到什么样的类型该如何进行转换
//意思意思就是说,把一个方法当做参数传进去,但是方法只能通过类或者对象调用
//所以只能写一个类,类里面写上方法(具体的转换操作)
ConvertUtils.register(new MyNewConverter(), Date.class);
//这是将表单传过来的参数键值复制给u对象进行封装
BeanUtils.populate(u1,request.getParameterMap());
} catch (Exception e) {
e.printStackTrace();
}
copyProperties(u1, u3);
response.getWriter().println("BeanUtils包:" + u1 + "
自己编写的:" + u2 + "
从u1拷贝的:" + u3);
}
//将map中的内容拷贝到u中
private void populate(Map map, User u) {
try {
//获取所有传过来的参数键值对
Map params = map;
BeanInfo info = Introspector.getBeanInfo(User.class);
//获取对象的所有属性
PropertyDescriptor[] pds = info.getPropertyDescriptors();
//遍历属性
for(PropertyDescriptor pd : pds){
//把当前遍历的属性名称当做key值在传过来的参数集合里面获取对应的值
String[] param = params.get(pd.getName());
//如果参数存在在将值赋给对应的属性
//由于传过来的参数全都是String类型,而bean类中的属性有其它类型,所以就需要类型转换,这里就不再编写了
if(param!=null && param.length>0){
if(pd.getPropertyType().equals(String.class)){
pd.getWriteMethod().invoke(u, param[0]) ;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
//将u1中的内容拷贝到u2
private void copyProperties(User u1, User2 u2) {
try {
//1 获得u1中信息
BeanInfo info = Introspector.getBeanInfo(u1.getClass());
//2 获得 u1中的所有属性信息
PropertyDescriptor[] pds = info.getPropertyDescriptors();
//3 遍历这些属性描述
for(PropertyDescriptor pd :pds){
String propName = pd.getName();
if (!propName.equals("class")) {
//4 查看u2是否具有这些属性
PropertyDescriptor pd2 = new PropertyDescriptor(propName, User2.class);
if (pd2 != null) {
//5 有该属性 ==> 获得该属性值,查看是否是null
Object obj = pd.getReadMethod().invoke(u1);
if (obj != null) {
//6 不是null 拷贝到u2
pd2.getWriteMethod().invoke(u2, obj);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
//转换器
public class MyNewConverter implements Converter{
@SuppressWarnings("rawtypes")
@Override
public Object convert(Class arg0, Object arg1) {
String birthdayStr = arg1.toString();//1990-01-01 ==> date
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try {
return format.parse(birthdayStr);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
}
${(num1 > num2)?"num1厉害":"老2厉害" }
JSTL标签库
JSTL:Java Standard Tag Libary
apache实现一套标准的标签库。(JCP.org)
由5部分组成:
*Core:核心
*Functions:EL函数(fn函数库)
Format:国际化
SQL:操作数据库
XML:操作XML
1>定义工具类,在类中定义静态方法
package com.jyh.bean;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ELTest{
//这里是自定义EL表达式
public static String getTime(String name){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
return simpleDateFormat.format(new Date().getTime()) + "----" + name;
}
}
JSTL 1.1 functions library
JSTL functions
1.1
myFn
http://www.jyh.com/myFn
getTime
com.jyh.bean.ELTest
java.lang.String getTime(java.lang.String)
${myFn:getTime()}
其它的可以去看官方文档或者直接去项目下的jstl包中的META-INFA目录下的fn.tld,里面有所有的fn函数以及简介
JSTL标签
1.JSTL标签的作用
自定义标签是属于JSP规范的。
开发原则:JSP中不要使用<%%>(标签替换)和<%=%>(EL表达式)
自定义标签的作用:替换掉JSP中的JSP脚本(<%%>),实现一些简单的逻辑运算。
2.自定义JSTL标签1>编写一个类,实现一个接口javax.servlet.jsp.tagext.SimpleTag.或者继承javax.servlet.jsp.tagext.SimpleTagSupport。
类一:显示时间
package com.jyh.bean;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
* 自定义显示时间标签
* @author OverrideRe
*
*/
public class ELTest extends SimpleTagSupport{
private int count;
public void setCount(int count) {
this.count = count;
}
//这里是自定义JSTL标签,重写父类的doTag方法
public void doTag(){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String dateStr = simpleDateFormat.format(new Date().getTime());
PageContext pContext = (PageContext)getJspContext();
try {
pContext.getOut().write(count + "次" +dateStr);
} catch (IOException e) {
e.printStackTrace();
}
}
}
类二:字符串处理
package com.jyh.bean;
import java.io.IOException;
import java.io.StringWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
* 自定义处理字符串标签(转大写)
* @author OverrideRe
*
*/
public class ELDemo extends SimpleTagSupport{
//这里是自定义EL标签,重写父类的doTag方法
public void doTag(){
JspFragment jf = getJspBody();//获取标签之间的文本内容
StringWriter writer = new StringWriter();//带缓存的输出流,在使用上的差别就是不需要参数(目标文件)
try {
jf.invoke(writer);//将获得的文本内容写入到带缓冲的输出流
String str = writer.toString();//将输出流里面的内容输出到字符串上
str = str.toUpperCase();//将文本内容转换成大写
getJspContext().getOut().write("转大写格式:" + str);
} catch (JspException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.jyh.bean;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
* 自定义for循环标签标签
* @author OverrideRe
*
*/
public class ForEachSimpleTag extends SimpleTagSupport{
private Object list;
private String item;
private Collection
2>在WEB-INF目录下,建立一个扩展名为tld(Tag Libary Definition)的xml文件。
注:tld如果在WEB-INF或者在jar包的META-INF目录下,都能自动找到。
1.0
tag
http://www.jyh.com/taglib
showTime
com.jyh.bean.ELTest
empty
count
true
true
getText
com.jyh.bean.ELDemo
scriptless
forEach
com.jyh.bean.ForEachSimpleTag
scriptless
list
true
true
item
true
false
3>(可选:tld不在WEB-INF或jar的META-INF目录下)修改web.xml,对tld和url进行一个映射
http://www.jyh.com/taglib
/tag.tld
4>在JSP中引入
<%@page import="com.jyh.bean.ELTest"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="myFn" uri="http://www.jyh.com/myFn"%>
<%@taglib prefix="tag" uri="http://www.jyh.com/taglib"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
My JSP 'EL.jsp' starting page
<%request.setAttribute("name", "requestTom"); %>
${requestScope.name}
<%session.setAttribute("name", "sessionTom"); %>
${sessionScope.name}
<%application.setAttribute("name", "applicationTom"); %>
${applicationScope.name}
<%pageContext.setAttribute("name", "pageContextTom"); %>
${pageScope.name}
${2 + 2}
<%=ELTest.getTime("tom")%>
${myFn:getTime("myFn")}自定义fn函数
<%
pageContext.setAttribute("p1", " ");
List list = new ArrayList();
list.add("p2");
pageContext.setAttribute("p2", list);
%>
${empty p1}
${empty p2}
自定义EL标签:
WEB-INF目录下的
非WEN-INF和META-INF目录下的,路径通过web.xml映射
这里是文本啊abcd
循环标签:
<%
List arrayList = new ArrayList();
arrayList.add("aaa");
arrayList.add("bbb");
arrayList.add("ccc");
pageContext.setAttribute("list", arrayList);
%>
${s}
3.学习系统自带的JSTL标签(核心标签库)
查看官方文档或者查看jstl包下的META-INF目录下的c.tld文件