struts转发请求
在struts的配置文件struts-config.xml文件中,可以配置forward标签,它用于封装一个转发地址。如:
<forward name=“success" path="/success.jsp"/>
struts配置文件的常用配置
<action
path=“/register“ 指定action处理的地址
type=“cn.itcast.RegisterAction" 请求action的完整类名
name=“UserFormBean“ 指定封装请求参数的formBean
scope="request" 把formBean放到哪个域对像中 默认为session
attribute=“myformbean" 指定formBean存储的key,不指定默认为name的值
input="/register.jsp" formBean效验失败后跳转到的页面
forward=“welcome.jsp“ 请求后跳转到页面
include="welcome.jsp" 请求时进行页面包含
unknown= “true" 对未知请求的处理
parameter=“method” 配置action的参数,可以调用mapping.getparameter("")
classname=“” action标签和所有配置信息使用哪个对像封装 默认值为actionmapping
validate="true" > 是否让struts自动调用formBean的volidate方法进行效验
<forward name="hello"
path="/success.jsp"/>
</action>
<html:link>标签的好处:
使用<html:link action=“/action”/>不用关心web应用程序的名称。
可以自动附加jsessionid参数进行url重写。
可以对参数信息进行url编码。
<html:link>标签常用属性:paramID、paramName、name、property。
例
<%request.setAttribute("name","中国"); %>
<html:link action="/registerUI?name=" paramId="name" paramName="name">注册</html:link>
用户使用<html:errors>标签可以很轻松获取到errors中保存的校验信息
1需要一个资源文件的支持 xx.properties
2 web.xml中
<message-resources parameter="cn.yue.resource.Myresource"></message-resources>
actionmessage
中文字符转unicode native2ascii 汉字
取资源文件方法一
ResourceBundle bundle=ResourceBundle.getBundle("cn.yue.resource.Myresource");
bundle.getString("");
方法二
MessageResources messageResources=MessageResources.getMessageResources("cn.yue.resource.Myresource");
messageResources.getMessage("");
表单效验
需要重写formBean的volidate方法
日期效验
一
DateLocaleConverter converter=new DateLocaleConverter(Locale.CHINA,"yyyy-MM-dd");
二 将beanutils包更换为1.8版本
枚举效验
名.valueof(属性名)
数据回显
formbean放在request作用域中,则可${frombean.属性名}
el函数
contains 查看某字串是否被另一个包含
${fn:contains(name, searchString)}
join 将数组按什么格式转换为字符串
${fn:join(array, ";")}
struts标签
<html:text>
<html:password redisply="false"> 不回显
<html:radio>
<html:select>
<html:option>
<html:checkbox> 没有回显功能
<html:multibox>
<html:textarea>
html 产生一个<html>标签。也包括来自于用户会话中的 language 属性
form 定义一个表单。Action 和 focus 属性是最有用的属性
checkbox 产生一个检查框字段
file 产生一个文件选择输入字段
hidden 产生一个隐藏字段
option 产生一个选择项
options 产生一个选择项列表
password 产生一个口令输入字段
radio 产生一个单选输入字段
select 产生一个选择元素
text 产生一个文本输入字段
textarea 产生一个 html 文本区域元素
image 产生一个图像输入字段
button 产生一个按钮输入字段
cancel 产生一个取消按钮
submit 产生一个提交按钮
reset 产生一个重新设定按钮
errors 显示错误消息
img 产生一个 html img 标签
formBean的reset struts在把表单数据封装到bean中时,会先调用reset方法
表单重复提交
saveToken(request);
boolean b=isTokenValid(request);
if(b==false)
{
System.out.println("表单重复提交");
return null;
}
resetToken(request);
System.out.println("处理请求");
中文乱码问题
1 过滤器
public class CharaterEncodingFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
final HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
httpServletResponse.setCharacterEncoding("utf-8");
httpServletResponse.setContentType("text/html;charset=utf-8");
httpServletRequest.setCharacterEncoding("utf-8");
chain.doFilter((HttpServletRequest) Proxy.newProxyInstance(CharaterEncodingFilter.class.getClassLoader(), request.getClass().getInterfaces(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("getParameter")) {
return method.invoke(httpServletRequest, args);
}
if (httpServletRequest.getMethod().equalsIgnoreCase("get")) {
return method.invoke(httpServletRequest, args);
}
String value = (String) method.invoke(httpServletRequest, args);
if (value == null) {
return null;
}
return new String(value.getBytes("iso8859-1"), "utf-8");
}
}), response);// 防止调用request.getParameter,增强类的方法
}
public void init(FilterConfig filterConfig) throws ServletException {
}
}
web.xml中配置过滤器
2 重写Actionsevlet
在service方法中设置request.setCharacterEncoding("utf-8");
更改web.xml文件
3 重写requestProcessor(请求处理器)
在process中request.setCharacterEncoding("utf-8");
web.xml保持不变
<controller processorClass="cn.yue.web.action.MyProcessor"></controller>
4 更改tomcat设置
把表单bean整到实体bean
1 BeanUtils.copyProperties(user, form);
该工具类只支持string类型,如果实体bean中有其他类型,需要注册转换器
ConvertUtils.register(new Converter() {
public Object convert(Class type, Object value) {
if (type != Date.class) {
throw new ConversionException("对不起你输入的类型不正确");
}
if (value == null) {
return null;
}
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
return dateFormat.parse((String) value);
} catch (ParseException e) {
throw new ConversionException("类型转换失败");
}
}
}, Date.class);
2 在web工程启动时注册转换器
1 编写监听器 RegisterConvertListener implements ServletContextListener 在contextInitialized(ServletContextEvent sce)方法中注册
3 在web.xml中
<listener>
<listener-class>cn.yue.web.listeners.RegisterConvertListener</listener-class>
</listener>
为了防止表单属性的反复转换,可以在formBean中添加一个实体bean的属性,在效验的过程中给实体bean赋值,这样就可以在action中用form.getxx()取得实体
如果表单提交不需要验证,可以直接在formBean 中实设置一个bean属性,页面中使用bean.属性
业务逻辑效验
跳转到input指定的页面
return mapping.getInputForward();
将错误信息存放到struts的错误信息中
1 方法一request.setAttribute("org.apache.struts.action.ERROR", errors); //GLOBAL
2 方法二saveErrors(request, errors);
数据回显
UserForm userForm=new UserForm();
userForm.setUserName(username);
request.setAttribute("userform", userForm);//用的是页面中form表单名作为关键字,也就是xml中formBean的名字
action处理多个不同请求方法
方法一
页面 <html:link action="/BookAction?method=add">添加书籍</html:link>
action中 String method = request.getParameter("method");
if ("add".equals(method)) {
add(mapping, form, request, response);
}
方法二
DispatchAction MappingDispatchAction
加载多个xml文件用逗号分开
动态FormBean
1 <form-bean name="dynaForm"
type="org.apache.struts.action.DynaActionForm">
<form-property name=“username" type="java.lang.String"/>
<form-property name=“birthday" type="java.lang.String"/>
<form-property name=“preference" type="java.lang.String[]"/>
<form-property name=“email" type="java.lang.String"/>
</form-bean>
2 如果需要校验,则要写一个formBean重写volidate方法