struts2.0(50-60)

来源:互联网 发布:广告策划职业数据分析 编辑:程序博客网 时间:2024/06/05 19:33

 

限制文件上传

解决上传不成功的问题,添加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/webXml中配置

 

改显示合理的信息给用户

<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 深入探索

struts2package可以被继承,Javapackage不能被继承

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.jarhttp://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

公司测试用:Jakartajmeter性能测试,cactus,仙人掌

 

ServletAPI测试:ActionContext能获取所有对象,

第一种方式:在action

// ActionContext.getContext().put("zhangsan","helloworld");//全局放入对象

          

页面获取:zhangsan${requestScope.zhangsan}

   

第二种方式

Action中:

public class LoginAction extends ActionSupport implements ServletRequestAware

{  

原创粉丝点击