struts2入门

搭建struts2开发环境的步骤:
1:创建一个web工程,将相应的jar包导入
2:创建jsp文件,通过链接跳转到相应的action文件中
3:编写action文件,实现action接口或者继承ActionSupport类
4:编写struts.xml配置文件
5:在web.xml中注册相应监听器
struts2的配置文件:
struts2把各种action分门别类地组织成不同的包,可以把包想象为一个模块,一个struts文件可以有一个或多个包,每个package元素都必须有一个name属性,相当于房间号,namespace属性是可选的,如果没有给出默认为“/”,若有值,想要调用这个包里的action就必须把这个属性所定义的命名空间添加到有关的URI字符串中,package要继承struts-default包,因为继承之后可以使用struts-default.xml文件里的结果类型和拦截器;每个action都必须有一个name属性,该属性和用户请求的action相对应,action中的class属性是可选的,如果没有配置,则将ActionSupport作为默认值,如果配置啦,还可以使用method属性配置该类的一个动作方法,method属性的默认值为execute方法。action的一个子元素:result,它告诉struts在完成动作后把控制权转交到哪里,它其中的name属性对应acion方法的返回值,name属性的默认值为success,同一个action中可能有多个result元素;result中的type属性指定结果类型,默认值为dispatcher,type属性的值必须是在包含当前包或者是当前包的父包里注册过的结果类型。
拦截栈中的拦截器按声明的顺序执行
在struts2中action的URL路径组成为:包的命名空间+action名称
action名称的搜索顺序:eg:http://server/struts2/path1/path2/path3/test.action,首先寻找命名空间为:/path1/path2/path3若没有再寻找命名空间为:/path1/path2如果还是没有则寻找命名空间为:/path1若还没有,则使用默认的命名空间:“/”
如果没有为action指定class,默认是ActionSupport。
2>如果没有为action指定method,默认执行action中的execute() 方法。
           ActionSupport的execute方法里面就一句话return "success";
3>如果没有指定result的name属性,默认值为success。
当配置找不到匹配的action时,会执行默认的action,默认action的配置<default-action-ref name="/>
struts2请求的处理后缀:
默认处理后缀是struts.action.extension定义的常量决定的,为action或者不写,若要修改,在struts文件中进行修改:<constant name="struts.action.extension" value="do,go"/>
struts2中常量的配置有两种方式:1:在struts.xml文件中<constant name="struts.action.extension" value="do,go"/>2:在src下新建struts.properties文件,在此文件下进行配置struts.action.extension=do,go
struts2加载常量的搜索顺序:struts-default.xml----struts-plugin.xml--struts.xml
当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 
    <constant name="struts.configuration.xml.reload" value="true"/>
   开发模式下使用,这样可以打印出更详细的错误信息 
    <constant name="struts.devMode" value="true" />
指定多个struts配置文件:<include file="struts-user.xml"/>
 <include file="struts-order.xml"/>
与servlet API解耦:
方法1:通过ServletActionContext类直接获取:
HttpServletRequest request=ServletActionContext.getRequest();
HttpServletResponse response=ServletActionContext.getResponse();
HttpSession session=request.getSession();
ServletContext application=ServletActionContext.getServletContext();(获取application)
方法2实现指定接口,由struts框架运行时注入:
实现接口:ParameterAware,ServletRequestAware,SessionAware,ServletContextAware
struts2的处理流程:
页面访问连接---->对应的服务器的类------->struts2拦截器(拦截器实现的功能:类型转换、文件上传、国际化、表单验证、自定义拦截器)------>action中的返回值
struts2的结果类型:
1:转发:dispatcher,也是struts2默认的结果类型,在struts2中的配置为:
<result name="execute" type="dispatcher">
/success.jsp
</result>
2:重定向:redirect,在struts2中的配置为:
<result name="redirect" type="redirect">
/success.jsp
</result>
3:重定向到另一个资源action中redirectAction,即从一个action跳转到另一个action
* actionName:访问另一个资源的Action的路径
* namespace:访问另一个资源的Action的路径的命名空间
<result name="redirectAction" type="redirectAction">
<param name="actionName">Helloworld</param>
<param name="namespace">/</param>
</result>
注意:重定向中保存在request中的数据将无法访问,需要通过${#request.username}这种方式
struts2通配符的调用
通配符映射示例(1):<br>
    <a href="${pageContext.request.contextPath}/pattern/a_add.action"> 通配符映射示例(1)</a><br>
    <a href="${pageContext.request.contextPath}/pattern/b_add.action"> 通配符映射示例(1)</a><br>
    <a href="${pageContext.request.contextPath}/pattern/c_add.action"> 通配符映射示例(1)</a><br>
<action name="*_add" class="cn.itcast.a_primer.BookAction" method="add">
<result name="add">
/success.jsp
</result>
</action>
通配符映射示例(2):<br>
    <a href="${pageContext.request.contextPath}/pattern/BookAction_add.action"> 图书</a><br>
    <a href="${pageContext.request.contextPath}/pattern/UserAction_add.action">用户</a><br>
<action name="*_add" class="cn.itcast.a_primer.{1}" method="add">
<result name="add">
/success.jsp
</result>
</action>
通配符映射示例(3):<br>
    <a href="${pageContext.request.contextPath}/pattern/BookAction_add.action">图书添加</a><br>
    <a href="${pageContext.request.contextPath}/pattern/BookAction_delete.action">图书删除</a><br>
     <br>
     <br>
    <a href="${pageContext.request.contextPath}/pattern/UserAction_add.action">用户添加</a><br>
    <a href="${pageContext.request.contextPath}/pattern/UserAction_delete.action">用户删除</a><br>
<action name="*_*" class="cn.itcast.a_primer.{1}" method="{2}">
<result name="add">
/success.jsp
</result>
<result name="delete">
/success.jsp
</result>
</action>
 动态方法调用(可以使用!+方法名调用制定方法)!形式:<br>
    <a href="${pageContext.request.contextPath}/pattern/BookAction!add.action">图书添加</a><br>
    <a href="${pageContext.request.contextPath}/pattern/BookAction!delete.action">图书删除</a><br>
<action name="BookAction" class="cn.itcast.a_primer.BookAction">
<result name="add">
/success.jsp
</result>
<result name="delete">
/success.jsp
</result>
</action>
全局结果(注意:局部的会覆盖全局的):
<global-results>
  <result name="message">/message.jsp</result>
 </global-results>
struts2属于多实例应用,每个请求都会创建一个action实例;
servlet属于单实例多线程的应用,实例只在初始化时,被加载,多实例 不会产生并发问题,但是执行速度不如单实例
Struts2类型转换:
1:struts通过parameter拦截器可以自动完成字符串和基本数据类型之间的转换;在Action中定义属性,并通过set方法和get方法为其赋值
类型:String,Double,Integer,Date...不仅赋值并实现了类型转换
自定义转换器(eg:日期转换;比如在提交页面上输入20121202):
(1)自定义转换器要继承DefaultTypeConverter,或者实现TypeConverter
(2)创建自定义拦截DateConverter,处理日期格式转换(YYYYMMDD)
         public class DateConverter extends DefaultTypeConverter {

   /**
    *   参数:Map context, Object value, Class toType
    *     * context:OGNL的上下文对象,用来存储存放OGNL对象的中值
    *     * value:需要转换的值,也就是表单元素中填写值,值是一个String类型的数组
    *     * toType:被转换的值的数据类型,本例来说(java.util.Date)
    *   返回值:表示返回的被转换后结果类型
    *          如果出现异常,返回null即可
    */
   @Override
   public Object convertValue(Map context, Object value, Class toType) {
    if(value == ""){
     return null;
    }
    if(toType == null){
     return null;
    }
    if(toType != java.util.Date.class){
     return null;
    }
    if(value instanceof java.lang.String[]) {
     String [] val = (String[]) value;
     String createTime = val[0];
     //处理类型转换,将YYYYMMDD的String类型转换成日期类型
     SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
     Date date = null;
     try {
      date = format.parse(createTime);
     } catch (ParseException e) {
      return null;
     }
     return date;
    }
    return null;
   }
  }
   (3)记载自定义转换器
       【1】:局部
             可以为某个动作的各个属性分别制定一个自定义的转换器. 
   创建一个属性文件: ActionClassName-conversion.properties, 该文
      件需和相对应的动作类(Action)放在同一个目录下, 
       ActionClassName是Action的类名,后面的-conversion.properties
      是固定写法.
              在properties文件中的内容为:
                        属性名称=类型转换器的全类名
      对于本例而言,文件的名称应为UserAction- conversion.properties 
   2. 编辑属性文件: 
             createTime=cn.itcast.converter.DateConverter

       【2】:全局
              在 WEB-INF/classes/ 目录下创建 xwork-conversion.properties 文件. 
       在properties文件中的内容为:
            待转换的类型=类型转换器的全类名
        对于本例而言, xwork-conversion.properties文件中的内容为:
        java.util.Date= cn.itcast.converter.DateConverter
     注意:如果2个都配置,局部覆盖全局
3、使用javabean和集合的方式获取页面表单的值(了解)
   /**
  * 此时表示用javabean的形式用来获取表单的值
  * 
  *  学历id:<input type="text" name="edu.id" value=""><br>
        学历名称:<input type="text" name="edu.eduname" value=""><br>
  */
注意:在定义类型转换器的局部或全局变量时,要注意命名,中间用的是中划线
文件上传:
在struts2中文件上传类型:.docx:octet-stream;.ppt:vnd.ms-powerpoint;.doc:msword;.xlsx:vnd.openxmlformats-officedocument.spreadsheetml.sheet
配置文件上传的拦截器,添加3个参数,
          * maximumSize表示文件大小
          * allowedTypes表示文件的类型
          * allowedExtensions表示文件上传的扩展名
 

搭建struts2开发环境的步骤:
1:创建一个web工程,将相应的jar包导入
2:创建jsp文件,通过链接跳转到相应的action文件中
3:编写action文件,实现action接口或者继承ActionSupport类
4:编写struts.xml配置文件
5:在web.xml中注册相应监听器
struts2的配置文件:
struts2把各种action分门别类地组织成不同的包,可以把包想象为一个模块,一个struts文件可以有一个或多个包,每个package元素都必须有一个name属性,相当于房间号,namespace属性是可选的,如果没有给出默认为“/”,若有值,想要调用这个包里的action就必须把这个属性所定义的命名空间添加到有关的URI字符串中,package要继承struts-default包,因为继承之后可以使用struts-default.xml文件里的结果类型和拦截器;每个action都必须有一个name属性,该属性和用户请求的action相对应,action中的class属性是可选的,如果没有配置,则将ActionSupport作为默认值,如果配置啦,还可以使用method属性配置该类的一个动作方法,method属性的默认值为execute方法。action的一个子元素:result,它告诉struts在完成动作后把控制权转交到哪里,它其中的name属性对应acion方法的返回值,name属性的默认值为success,同一个action中可能有多个result元素;result中的type属性指定结果类型,默认值为dispatcher,type属性的值必须是在包含当前包或者是当前包的父包里注册过的结果类型。
拦截栈中的拦截器按声明的顺序执行
在struts2中action的URL路径组成为:包的命名空间+action名称
action名称的搜索顺序:eg:http://server/struts2/path1/path2/path3/test.action,首先寻找命名空间为:/path1/path2/path3若没有再寻找命名空间为:/path1/path2如果还是没有则寻找命名空间为:/path1若还没有,则使用默认的命名空间:“/”
如果没有为action指定class,默认是ActionSupport。
2>如果没有为action指定method,默认执行action中的execute() 方法。
           ActionSupport的execute方法里面就一句话return "success";
3>如果没有指定result的name属性,默认值为success。
当配置找不到匹配的action时,会执行默认的action,默认action的配置<default-action-ref name="/>
struts2请求的处理后缀:
默认处理后缀是struts.action.extension定义的常量决定的,为action或者不写,若要修改,在struts文件中进行修改:<constant name="struts.action.extension" value="do,go"/>
struts2中常量的配置有两种方式:1:在struts.xml文件中<constant name="struts.action.extension" value="do,go"/>2:在src下新建struts.properties文件,在此文件下进行配置struts.action.extension=do,go
struts2加载常量的搜索顺序:struts-default.xml----struts-plugin.xml--struts.xml
当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 
    <constant name="struts.configuration.xml.reload" value="true"/>
   开发模式下使用,这样可以打印出更详细的错误信息 
    <constant name="struts.devMode" value="true" />
指定多个struts配置文件:<include file="struts-user.xml"/>
 <include file="struts-order.xml"/>
与servlet API解耦:
方法1:通过ServletActionContext类直接获取:
HttpServletRequest request=ServletActionContext.getRequest();
HttpServletResponse response=ServletActionContext.getResponse();
HttpSession session=request.getSession();
ServletContext application=ServletActionContext.getServletContext();(获取application)
方法2实现指定接口,由struts框架运行时注入:
实现接口:ParameterAware,ServletRequestAware,SessionAware,ServletContextAware
struts2的处理流程:
页面访问连接---->对应的服务器的类------->struts2拦截器(拦截器实现的功能:类型转换、文件上传、国际化、表单验证、自定义拦截器)------>action中的返回值
struts2的结果类型:
1:转发:dispatcher,也是struts2默认的结果类型,在struts2中的配置为:
<result name="execute" type="dispatcher">
/success.jsp
</result>
2:重定向:redirect,在struts2中的配置为:
<result name="redirect" type="redirect">
/success.jsp
</result>
3:重定向到另一个资源action中redirectAction,即从一个action跳转到另一个action
* actionName:访问另一个资源的Action的路径
* namespace:访问另一个资源的Action的路径的命名空间
<result name="redirectAction" type="redirectAction">
<param name="actionName">Helloworld</param>
<param name="namespace">/</param>
</result>
注意:重定向中保存在request中的数据将无法访问,需要通过${#request.username}这种方式
struts2通配符的调用
通配符映射示例(1):<br>
    <a href="${pageContext.request.contextPath}/pattern/a_add.action"> 通配符映射示例(1)</a><br>
    <a href="${pageContext.request.contextPath}/pattern/b_add.action"> 通配符映射示例(1)</a><br>
    <a href="${pageContext.request.contextPath}/pattern/c_add.action"> 通配符映射示例(1)</a><br>
<action name="*_add" class="cn.itcast.a_primer.BookAction" method="add">
<result name="add">
/success.jsp
</result>
</action>
通配符映射示例(2):<br>
    <a href="${pageContext.request.contextPath}/pattern/BookAction_add.action"> 图书</a><br>
    <a href="${pageContext.request.contextPath}/pattern/UserAction_add.action">用户</a><br>
<action name="*_add" class="cn.itcast.a_primer.{1}" method="add">
<result name="add">
/success.jsp
</result>
</action>
通配符映射示例(3):<br>
    <a href="${pageContext.request.contextPath}/pattern/BookAction_add.action">图书添加</a><br>
    <a href="${pageContext.request.contextPath}/pattern/BookAction_delete.action">图书删除</a><br>
     <br>
     <br>
    <a href="${pageContext.request.contextPath}/pattern/UserAction_add.action">用户添加</a><br>
    <a href="${pageContext.request.contextPath}/pattern/UserAction_delete.action">用户删除</a><br>
<action name="*_*" class="cn.itcast.a_primer.{1}" method="{2}">
<result name="add">
/success.jsp
</result>
<result name="delete">
/success.jsp
</result>
</action>
 动态方法调用(可以使用!+方法名调用制定方法)!形式:<br>
    <a href="${pageContext.request.contextPath}/pattern/BookAction!add.action">图书添加</a><br>
    <a href="${pageContext.request.contextPath}/pattern/BookAction!delete.action">图书删除</a><br>
<action name="BookAction" class="cn.itcast.a_primer.BookAction">
<result name="add">
/success.jsp
</result>
<result name="delete">
/success.jsp
</result>
</action>
全局结果(注意:局部的会覆盖全局的):
<global-results>
  <result name="message">/message.jsp</result>
 </global-results>
struts2属于多实例应用,每个请求都会创建一个action实例;
servlet属于单实例多线程的应用,实例只在初始化时,被加载,多实例 不会产生并发问题,但是执行速度不如单实例
Struts2类型转换:
1:struts通过parameter拦截器可以自动完成字符串和基本数据类型之间的转换;在Action中定义属性,并通过set方法和get方法为其赋值
类型:String,Double,Integer,Date...不仅赋值并实现了类型转换
自定义转换器(eg:日期转换;比如在提交页面上输入20121202):
(1)自定义转换器要继承DefaultTypeConverter,或者实现TypeConverter
(2)创建自定义拦截DateConverter,处理日期格式转换(YYYYMMDD)
         public class DateConverter extends DefaultTypeConverter {

   /**
    *   参数:Map context, Object value, Class toType
    *     * context:OGNL的上下文对象,用来存储存放OGNL对象的中值
    *     * value:需要转换的值,也就是表单元素中填写值,值是一个String类型的数组
    *     * toType:被转换的值的数据类型,本例来说(java.util.Date)
    *   返回值:表示返回的被转换后结果类型
    *          如果出现异常,返回null即可
    */
   @Override
   public Object convertValue(Map context, Object value, Class toType) {
    if(value == ""){
     return null;
    }
    if(toType == null){
     return null;
    }
    if(toType != java.util.Date.class){
     return null;
    }
    if(value instanceof java.lang.String[]) {
     String [] val = (String[]) value;
     String createTime = val[0];
     //处理类型转换,将YYYYMMDD的String类型转换成日期类型
     SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
     Date date = null;
     try {
      date = format.parse(createTime);
     } catch (ParseException e) {
      return null;
     }
     return date;
    }
    return null;
   }
  }
   (3)记载自定义转换器
       【1】:局部
             可以为某个动作的各个属性分别制定一个自定义的转换器. 
   创建一个属性文件: ActionClassName-conversion.properties, 该文
      件需和相对应的动作类(Action)放在同一个目录下, 
       ActionClassName是Action的类名,后面的-conversion.properties
      是固定写法.
              在properties文件中的内容为:
                        属性名称=类型转换器的全类名
      对于本例而言,文件的名称应为UserAction- conversion.properties 
   2. 编辑属性文件: 
             createTime=cn.itcast.converter.DateConverter

       【2】:全局
              在 WEB-INF/classes/ 目录下创建 xwork-conversion.properties 文件. 
       在properties文件中的内容为:
            待转换的类型=类型转换器的全类名
        对于本例而言, xwork-conversion.properties文件中的内容为:
        java.util.Date= cn.itcast.converter.DateConverter
     注意:如果2个都配置,局部覆盖全局
3、使用javabean和集合的方式获取页面表单的值(了解)
   /**
  * 此时表示用javabean的形式用来获取表单的值
  * 
  *  学历id:<input type="text" name="edu.id" value=""><br>
        学历名称:<input type="text" name="edu.eduname" value=""><br>
  */
注意:在定义类型转换器的局部或全局变量时,要注意命名,中间用的是中划线
文件上传:
在struts2中文件上传类型:.docx:octet-stream;.ppt:vnd.ms-powerpoint;.doc:msword;.xlsx:vnd.openxmlformats-officedocument.spreadsheetml.sheet
配置文件上传的拦截器,添加3个参数,
          * maximumSize表示文件大小
          * allowedTypes表示文件的类型
          * allowedExtensions表示文件上传的扩展名
 <!-- 
        定义拦截器,在fileUpload拦截器中,添加限定文件上传的条件,在package下添加,对应的package下所有的action都有效
          * 如果在interceptors定义文件大小,将会覆盖constant中定义的文件大小,文件大下以拦截器中定义的为准
          * 在默认栈中添加fileUpload拦截器的条件
          * 将默认栈defaultStack放置到fileUpload拦截器的下面,表示会添加upload拦截器的时候,同时执行defaultStack的相关配置
       -->  
修改显示错误的资源文件的信息:
第一步:创建新的资源文件 例如fileuploadmessage.properties,放置在src下
           在该资源文件中增加如下信息
struts.messages.error.uploading=上传错误: {0}
struts.messages.error.file.too.large=上传文件太大: {0} "{1}" "{2}" {3}
struts.messages.error.content.type.not.allowed=上传文件的类型不允许: {0} "{1}" "{2}" {3}
struts.messages.error.file.extension.not.allowed=上传文件的后缀名不允许: {0} "{1}" "{2}" {3}

 第二步:在struts.xml文件加载该资源文件
       <!-- 设置comonfileupload上传组件允许的文件大小 才能测试出上传文件过大出现的错误信息 -->
       <constant name="struts.multipart.maxSize" value="86170804"/>

       <!-- 配置上传文件的出错信息的资源文件 -->
       <constant name="struts.custom.i18n.resources" value="fileuploadmessage“/>
<!-- 
  配置国际化资源文件,struts启动的时候加载对应路径下资源文件
    * 如果资源文件放置到src(类路径),value的值直接指定资源文件的名称即可,例子:fileupload
    * 如果资源文件放置到cn.itcast.f_upload下,value的值指定cn.itcast.f_upload路径下的资源文件,例子:cn.itcast.f_upload.fileupload
    * 如果多个资源文件用逗号分开
   -->
 <constant name="struts.custom.i18n.resources" value="fileupload,cn.itcast.l_model.token"></constant>

 

你可能感兴趣的:(包,action,配置文件,package)