限制文件上传
解决上传不成功的问题,添加input属性
<action name="upload" class="com.test.action.UploadAction">
<result name="success">/uploadResult.jsp</result>
<result name="input">/upload.jsp</result>
<!-- 应用内置拦截器,拦截非法文件,最大大小,和文件类型 -->
<interceptor-ref name="fileUpload">
<param name="maximumSize">409600</param>
<!—ppt类型 -->
<param name="allowedTypes">application/vnd.ms-powerpoint</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
所有的类型都在C:/apache-tomcat-6.0.20/conf/web。Xml中配置
改显示合理的信息给用户
<table align="center" width="50%">
<tr>
<td>
<s:fielderror cssStyle="color:red" />
</td>
</tr>
</table>
在核心包里面的struts-message.properties文件中找到字段
在全局的信息文件message.properties
中覆盖:
#xwork.default.invalid.fieldvalue={0} error
struts.messages.error.content.type.not.allowed=/u4e0a/u4f20/u6587/u4ef6/u7c7b/u578b/u4e0d/u5141/u8bb8/uff0c/u8bf7/u91cd/u8bd5/uff01
struts.messages.error.file.too.large=/u4e0a/u4f20/u6587/u4ef6/u8fc7/u5927/uff0c/u8bf7/u91cd/u8bd5/uff01
其他的错误类型错误信息:
struts.messages.error.uploading=Error uploading: {0}
文件下载
<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
下载页面
<%@ taglib prefix="s" uri="/struts-tags" %>
<body>
<s:a href="/struts2/download.action">download</s:a>
</body>
Action处理:
public class DownloadAction extends ActionSupport
{ //获取流对象
public InputStream getDownloadFile()
{
return ServletActionContext.getServletContext().getResourceAsStream(
"/upload/Struts2.ppt");
}
@Override
public String execute() throws Exception
{
return SUCCESS;
}
}
Struts.xml
<action name="download" class="com.test.action.DownloadAction">
<result name="success" type="stream">//type不能改变
<param name="contentType">application/vnd.ms-powerpoint</param>
<param name="contentDisposition">filename="Struts2.ppt"</param>
<param name="inputName">downloadFile</param>//下载要获得的流方法
</result>
</action>
同时可以设置权限作为拦截器,是否可以下载
Struts2国际化:
JDK:
public static void main(String[] args)
{
//得到当前所有的当前系统的所有locale
Locale[] locales = Locale.getAvailableLocales();
for(Locale locale : locales)
{
System.out.println(locale.getDisplayCountry() + " : " + locale.getCountry());
System.out.println(locale.getDisplayLanguage() + " : " + locale.getLanguage());
}
}
资源文件的建立:文件名_语言名_国家名.properties
建立资源包
hellofile_en_US.properties
hellofile_zh_CN.properties
hello = /u4f60/u597d : {0}
//取得默认locale
//Locale locale = Locale.getDefault();
//取得实例
Locale locale = Locale.US;
//获得基本名称
ResourceBundle bundle = ResourceBundle.getBundle("hellofile",locale);
String value = bundle.getString("hello");
System.out.println(value);
格式化占位符
Locale locale = Locale.US;
ResourceBundle bundle = ResourceBundle.getBundle("hellofile",locale);
String value = bundle.getString("hello");
String result = MessageFormat.format(value,new Object[]{"北京"});
System.out.println(result);
Struts2国际化:
Jsp:
配置struts.xml
<struts>
<constant name="struts.custom.i18n.resources" value="message"></constant>//value是国际化的基本名字
建立资源文件
message_en_US.properties
message_zh_CN.properties
message.properties
内容
addUser = Add User Information
jsp页面:
<center>
<s:text name="hello"></s:text>
</center>
要改变就改浏览器语言就行
velidate国际化
建立资源文件,在src下全局的
message_en_US.properties
message_zh_CN.properties
message.properties
内容
addUser = Add User Information
username.invalid = username "{0}" invalid
username.xml.invalid = username xml invalid
页面修改:
<s:actionerror cssStyle="color:red" />
Action修改:
@SuppressWarnings("unchecked")
public void validate()
{
if (null == username || username.length() < 6 || username.length() > 10)
{
List list = new ArrayList();
list.add(username);
this.addActionError(this.getText("username.invalid",new String[]{username}));
}
验证框架XML的国际化
页面:
<s:fielderror cssStyle="color:red" />
RegisterAction-validation.xml
<field name="username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message key="username.xml.invalid"></message>
</field-validator>
资源文件的修改:
username.xml.invalid = username xml invalid
国际化局部有包级别和类级别的
包级别的:
在包下名称:package_语言_国家
package_zh_CN.properties
package_en_US.properties
内容:
username.xml.invalid = package information
使用和全局的一样:
类级别的:在包下建立资源文件
类名—语言-国家:
RegisterAction_en_US.properties
RegisterAction_zh_CN.properties
表单国际化:
页面:去掉表单的 theme="simple"
<s:textfield name="username" key =" username.xml.invalid " id="usernameId"></s:textfield>
I48N可以制定到那个文件去找:
建立资源文件在src下面:
temp_en_US.properties
temp_zh_CN.properties
内容
hello = world,{0}
页面:
<center>
<s:i18n name="temp">//文件名称
<s:text name="hello">//KEY
<s:param>langsin</s:param>//定位符的值
</s:text>
</s:i18n>
</center>
同时il8n中的request_locale 能改变国际化文件的属性 :如动态的改变资源文件用session保存“request_locale”为zh 就是中文。类推
Struts2 深入探索
struts2的package可以被继承,Java的package不能被继承
struts 系统加载时先吧struts_default.xml的信息加载入内存,才去加载struts.xml 然后把struts_default的信息加载到我们当前的系统里面。
修改struts2-core-2.0.jar/org.apache.struts2/default.properties的信息
1.我们可以在struts.xml里面通过一个content,去修改struts核心包里面的default.properties 里面的属性,如gbk的修改。
<constant name="struts.multipart.saveDir" value="c:/"></constant>
2.可以看它文件里边的注释,在src下写一个struts.properties文件覆盖它就行。
文件里边内容:
struts.i18n.encoding = gbk
struts.action.extension=do //去掉表单的.action,他会自动加载action
插件的使用:struts.configuration.files=struts-default.xml,struts-plugin.xml,struts.xml中 struts-plugin.xml使用:
解压struts2-spring-plugin-2.1.8.1.jar,http://cwiki.apache.org/S2PLUGINS/home.html
3.在web.xml里面配置,不使用:web.xml中
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
<init-param>
<param-name>struts.i18n.encoding</param-name>
<param-value>gbk</param-value>
</init-param>
</filter>
Struts-default.xml 中<package name="struts-default" abstract="true">
表示抽象包里面没有一行的action的配置。
命名空间的使用:struts.xml中
<package name="struts2" extends="struts-default" namespace="/hello">
表单中: <s:form action="/hello/register.action" theme="simple">//一定要手动加.action
运行之后,路径变成:工程名+hello+xxx.action
如果没有命名空间,action自动去,有没有命名空间,没有,再去找有没有register.action,如果有就匹配它。没有才报错。
模块化解决struts.xml过长的问题。
<struts>
<include file="struts_1.xml"></include>
<include file="struts_2.xml"></include>
<constant name="struts.custom.i18n.resources" value="message"></constant>
以上是struts2的属性驱动
Struts2的核心控制器是org.apache.struts2.dispatcher.FilterDispatcher
业务控制器:public class RegisterAction extends ActionSupport
Struts2的模型驱动:
建立一个收集表单的类user:
package com.test.bean;
import java.util.Date;
public class User
{
private String username;
private String password;
private String repassword;
private int age;
private Date birthday;
private Date graduation;
-----提供getset方法----
}
建立action类并,告诉它去收集:
package com.test.action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;
import com.test.bean.User;
public class RegisterAction2 extends ActionSupport implements ModelDriven<User>
{
private User user = new User();
public User getModel()
{
return user;
}
@Override
public String execute() throws Exception
{
return SUCCESS;
}
}
或
package com.test.action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;
import com.test.bean.User;
//Preparable在其他方法执行之前去执行的工作
public class RegisterAction2 extends ActionSupport implements ModelDriven<User>,Preparable
{
private User user = new User();
public User getModel()
{
return user;
}
public void prepare() throws Exception
{
System.out.println("hello world");
}
@Override
public String execute() throws Exception
{
return SUCCESS;
}
}
Struts.xml修改:
<action name="register" class="com.test.action.RegisterAction2">
<result name="success">/success.jsp</result>
<result name="input">/register2.jsp</result>
格式化信息显示:显示在文本末尾,页面改变:
<tr>
<td>
username
</td>
<td>
<s:textfield name="username" label="username" id="usernameId"></s:textfield>
</td>
<td>
<s:fielderror cssStyle="color:red">
<s:param>username</s:param>//显示指定文本
</s:fielderror>
</td>
</tr>
要去掉点的信息,就要把核心包里面的,template.simple里面的filederror.ftl文件覆盖掉就可以。
表单重复提交:
<s:form action="/hello/register.action" theme="simple">
<s:token></s:token>//加它就行或者加<s:token name="hello"></s:token> name是它的一个标示
Struts.xml的配置
<action name="register" class="com.test.action.RegisterAction">
<result name="success">/success.jsp</result>
<result name="input">/register2.jsp</result>//错误输出页面
<result name="invalid.token">/register2.jsp</result>//重复提交出错页面返回
<interceptor-ref name="token"></interceptor-ref>//拦截器引用
<interceptor-ref name="defaultStack"></interceptor-ref>
页面处理:
<table align="center" width="40%">
<tr>
<td>
<s:fielderror cssStyle="color:red" />
<s:actionerror cssStyle="color:blue"/>//处理action的错误
</td>
</tr>
</table>
资源文件中处理:
struts.messages.invalid.token = /u8bf7/u4e0d/u8981/u91cd/u590d/u63d0/u4ea4/u8868/u5355
公司测试用:Jakarta,jmeter性能测试,cactus,仙人掌
ServletAPI测试:ActionContext能获取所有对象,
第一种方式:在action中
// ActionContext.getContext().put("zhangsan","helloworld");//全局放入对象
页面获取:zhangsan:${requestScope.zhangsan}
第二种方式
Action中:
public class LoginAction extends ActionSupport implements ServletRequestAware
{