Struts1.X学习笔记 8月28日
2009
[在此处键入文档的摘要。摘要通常是对文档内容的简短总结。在此处键入文档的摘要。摘要通常是对文档内容的简短总结。] MVC框架以及标签的使用
Structs1.x框架工作流程
方法介绍
Action是Struct父接口,其中里面的方法是public ActionForward
execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response){}
throws Exception
ActionForm是获取表单中的数据
ActiionForward是进行转向处理
工作流程
response
dispatch
response
request
JSP
Struts Taglib(标签)
Struts 标签的配置和使用
配置:
* 在struts-config.xml文件中加入
* 拷贝MessageResources.properties文件到src下
使用:
* 采用taglib指令引入
<%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean"%>
<%@ taglib prefix="logic" uri="http://struts.apache.org/tags-logic"%>
Struts 常使用的标签如下:
JSTL标签的使用(学习的重点,必须掌握)
简介:SUN的标准taglib库
Jsp标准标签库(jsp standard Tag Library,JSTL)
迭代和条件判断
数据管理格式化
XML操作
数据库访问
函数标签库
表达式语言(EL)
El隐式对象
存取器
运算符
EL实例如下:
hello(jsp脚本):<%=request.getAttribute("hello") %>
hello(el表达式,el表达式的使用方法$和{}):${hello }
hello(el表达式,el的隐含对象pageScope,requestScope,sessionScope,applicationScope,
如果未指定scope,它的搜索顺序为pageScope~applicationScope):${requestScope.hello }
hello(el表达式,scope=session):${sessionScope.hello }
姓名:${user.username }
年龄:${user.age }
所属组:${user.group.name }
mapvalue.key1:${mapvalue.key1 }
mapvalue.key2:${mapvalue.key2 }
strarray[2]:${strarray[1] }
userarray[3].username:${users[2].username }
userlist[5].username:${userlist[4].username }
1+2=${1+2 }
10/5=${10/5 }
10 div 5=${10 div 5 }
10%3=${10 % 3 }
10 mod 3=${10 mod 3 }
value1:${empty value1 }
value2:${empty value2 }
value3:${empty value3 }
value4:${empty value4 }
value4:${!empty value4 }
JSTL_核心库标签
hello(default):
hello(el表达式):${hello }
hello(default="123"):
hello(default="123"):
bj(defalut):
bj(escapeXml="true"):
bj(escapeXml="false"):
bj(el表达式):${bj }
temp:${temp }
temp:${temp }
v1小于v2
v=${v }
v3为空
v4为空
v1小于v2
v1大于v2
v4为空
v4不为空
姓名 | 年龄 | 所属组 |
没有符合条件的数据! | ||
${u.username } | ${u.age } | ${u.group.name } |
姓名 | 年龄 | 所属组 |
没有符合条件的数据! | ||
|
|
|
姓名 | 年龄 | 所属组 |
没有符合条件的数据! | ||
${user.username} | ${user.age} | ${user.group.name } |
a
${v.key }=${v.value }
${v }
<%
try {
Integer.parseInt("asdfsdf");
}catch(Exception e) {
out.println(e.getMessage());
}
%>
<%
Integer.parseInt("asdfsdf");
%>
${exinfo }
${v }
Jstl格式化标签的使用
实例
date(default):
d=${d}
date(type="time"):
date(type="date"):
date(type="both" ):
date(type="both" dateStyle="long"):
date(type="both" dateStyle="full"):
date(type="both" timeStyle="full"):
date(type="both" pattern="yyyy-mm-dd hh-mm=ss" ):
数字的格式化(default):
数字格式化(type="number"):
数字格式化 (type="currency"):
总共的金额是:${m}
百分比(pdate type="percent" ):
${p}
JSTL函数库(以及自定义函数库)
自定义函数的规则
jstl_fn自定义函数库:
1、定义类和方法(方法必须是public static)
2、编写自定义tld文件,并且将此文件放到WEB-INF或WEB-INF任意子目录下
3、在jsp中采用taglib指令引入自定义函数库
4、采用 前缀+冒号+函数名 调用即可
实例
hello(jsp 脚本):<%=((String)request.getAttribute("hello")).length() %>
helo(jstl函数库,函数调用必须在el表达式中 前缀+冒号+函数名):${fn:length(hello)}
list集合的长度:${fn:length(list) }
sayHello(自定义函数):${myfunction:sayhello(name)}
动态ActionForm(可以动态的获取页面提交的数据)
1、动态ActionForm
动态ActionForm是为了避免标准ActionForm膨胀而设计的,使用动态ActionForm可以获得标准
ActionForm的所有功能
* 在struts-config.xml文件中定义动态ActionForm,如:
*在Action中使用动态ActionForm,参见DynaActionFormTestAction.java 使用了DynaActionForm累中get的方法
DynaActionForm daf = (DynaActionForm)form;
String username = (String)daf.get("username");
Integer age = (Integer)daf.get("age");
注意:DynaActionForm是Struct1.x自带的一个类
动态ActionForm其实是把页面中的html元素的名字和值放到了map中,所以通过get方法可以取出相应的值
动态ActionForm采用EL表达式的输出方式,${dynabean.map.prop}, 参见:dyna_actionform.jsp
动态Action的验证,通常使用动态验证框架validator
2、采用struts上传文件
* 页面的配置,如:
* ActionForm中使用FormFile来接收上传的文件,参见:UploadActionForm.java
* 在Action中调用FormFile取得上传文件数据,采用流输出,即完成上传,参见:UploadTestAction.java
* 采用
3、空字段测试
* 在表单中没有input输入域,jsp脚本接收到的值为null,el表达式接收到的值为空串
* 如果表单中的值,没有输入,那么jsp脚本和el表达式接收到的值都为空串
4测试ActionForm类型的自动转换
* boolean:yes,1,on,true都会转换成True类型,而且忽略大小写,其他情况转换成false
* Date类型的转换:
* 如果是java.sql.Date,页面日期的格式必须为yyyy-mm-dd,才可以转换
* 如果是java.util.Date,默认情况下struts无法转换
* 自定义转换器的实现步骤
* 实现converter接口,实现convert方法
* 将实现的conerter注册,通常情况采用servlet注册
* 采用servlet注册需要注意标签的配置,
Struts对ActionForm的自动搜集过程:
* 将页面数据放到map中,其中map中的key为页面中的名称,map中的value为页面中的value值
* 调用BeanUtils.setProperties方法,将map中的值逐个设置到ActionForm实例上,对于ActionForm中的每个属性
根据类型调用相应的Converter,然后调用相应的convert方法,将相应的字符串转换成ActionForm中指定的类型
可以通过BeanUtils.copyProperties(目标对象,源对象)方法进行对象值的复制。
5.ActionForward知识点复习
ActionForward的使用
1、理解全局和局部ActionForward的概念
2、redirect的使用
3、struts-config.xml文件不允许动态修改
4、理解动态ActionForward,动态的ActionForward是可以运行期修改的
6.ActionMapping的复习
1、struts-config.xml文件中,每个
2、了解
3、了解采用jstl和struts标签保持页面数据
7. 分布数据
8.struts 国际化
Java中的国家化问题
1、了解缺省Locale是由操作系统决定的,Locale是由语言和国家代码组成
2、国际化资源文件是由baseName+locale组成,如:MessageBundle_en_US.properties
baseName是任意合法的文件名
3、native2ascii命令的位置和用法
* 位置:JAVA_HOME/bin
* 使用native2ascii.exe o.properties MessagesBundle_zh_CN.properties
4.
eg
Locale defaultl=Locale.getDefault();
System.out.println(defaultl.getCountry());
System.out.println(defaultl.getLanguage());
ResourceBundle r=ResourceBundle.getBundle("res.MessagesBundle", defaultl);
System.out.println(r.getString("k1"));
System.out.println(r.getString("k2"));
MessageFormat mf=new MessageFormat(r.getString("k1"),defaultl);
Object[] o={"wulinbo","早撒谎那个好"};
System.out.println("使用国际化处理(动态处理的国际化 )"+mf.format(new Object[]{"吴林波","早上好"}));
System.out.println("使用国际化处理(动态处理的国际化 )"+mf.format(o));
Struts国际化问题
概念区分
硬编码国际化(指的是静态中文转换为其他的一种语言)
动态编码国际化(是指的是程序在运行期间的代码的国际化,可以使用占位符)
1、struts国际化的配置
* 在struts-config.xml文件中加入:
2、提供不同版本的国际化资源文件,中文需要采用native2ascii转换成unicode
3、在jsp中采用
4、了解利用struts默认将locale放到session中的特性,完成采用编程的方式切换语言设置
* 参见:ChangeLanguageAction.java 如下
String language=request.getParameter("language");
Locale defaultl=Locale.getDefault();
if(language.equals("CN"))
{
defaultl=new Locale("zh","CN");
}
else if(language.equals("US"))
{
defaultl=new Locale("en","US");
}
//使用struts中的方法 是一种session HttpSession session =request.getSession()
//session.setAttribute("","");
request.getSession().setAttribute(Globals.LOCALE_KEY, defaultl);//import org.apache.struts.Globals;
//this.setLocale(request, defaultl);//使用Action中自己带的SetLocal来设置本地语言
return mapping.findForward("lanChange");
5、消息文本的国际化处理,共有三个步骤:
* 创建国际化消息
* 传递国际化消息
* 显示国际化消息
如何创建国际化消息?
理解ActionMessage和ActionMessages两个对象的区别
如何传递国际化消息?
* 调用saveMessage()传递普通消息,调用saveErrors传递错误消息
如何显示国际化消息?
通过
通过
了解 使用JSTL标签中的fmt格式化标签来国家化
首先在.jsp文件的头文件上添加
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
其中properties文件放在res文件中
其次使用如下
struts异常处理
1、编程式异常
* 截获异常
* 创建相应的异常消息
* 传递异常消息
* 转向相应的页面处理异常
2、声明式异常(自动处理的异常)
* 在struts-config.xml文件中配置
* 理解局部和全局exception
* 注意局部
* key:指异常信息对应的国际化消息文本,这个key值需要在国际化资源文件中定义
* type: 处理那种异常
* path: 定义一但出现异常,需要转向那个页面,如果不定义path,
默认情况下将使用
* scope:可以取值request和session,默认为request
* handler:异常的处理类,struts默认采用org.apache.struts.action.ExceptionHandler,
如果做个性化的异常处理可以继承此类覆写相应的方法
参见:ErrorCodeExceptionHandler.java和AppExceptionHandler.java
DispatchAction应用
可以减少struts配置文件中的action量
如下例子:
配置文件
userAction类处理
主要是继承了dispatchAction 该类
public class userAction extends DispatchAction {
public ActionForward add(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub
//return mapping.findForward("add_success");
return mapping.findForward("success");
}
public ActionForward del(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub
//return mapping.findForward("del_success");
return mapping.findForward("success");
}
public ActionForward modify(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub
//return mapping.findForward("modify_success");
return mapping.findForward("success");
}
}
jsp页面的请求处理
struts模式匹配