码迷,mamicode.com
首页 > 其他好文 > 详细

Struts2学习笔记(2)

时间:2016-06-24 15:21:57      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:

1.action生命周期

对于每次httpservlet的请求,都会产生一个新的action 的实例

  1. result 中关于name属性的配置和type属性 (struts.xml)

name 属性在struts2中有一些默认的比如success和error,input 等 ,当然也可以自己对name属性进行自定义
注:result 除了

<result name="input">index.jsp</result>    可以返回到某一个页面上面
<result name="input">student1</result>     也可以去请求一个路径

————————-分割线
type属性:默认的 dipatcher

redirect 重定向
chain   链  
redirectAction  重定向到一个action

3.struts.xml中package中的全局的配置
在package中

    <!-- 全局配置 -->
                <global-results>  
                           <result name="error">index.jsp</result>  
                </global-results> 

4.如何在action中获取servlet-api 中的 request 和 session 和 response
4.1.通过 ServletActionContext 获取内置对象

HttpServletRequest request = ServletActionContext.getRequest(); //直接获得 request 对象
HttpServletResponse response = ServletActionContext.getResponse();//直接获得response对象
HttpSession session = (HttpSession)ServletActionContext.getContext().getSession();//获取session 对象
Map application = ServletActionContext.getContext().getApplication();//获取application 对象
注: application 这里返回的形式是map类型

4.2 通过Actioncontext 获取内置对象

        ActionContext cxt = ActionContext.getContext(); 
        HttpServletRequest request = (HttpServletRequest)cxt.get(ServletActionContext.HTTP_REQUEST);  
        HttpServletResponse response = (HttpServletResponse)cxt.get(ServletActionContext.HTTP_RESPONSE);  
         HttpSession session = (HttpSession)cxt.get(ServletActionContext.SESSION); //(HttpSession)cxt.getSession();          Map application = (Map)cxt.get(ServletActionContext.APPLICATION); //(Application)cxt.getApplication(); 

4.3 通过IOC 方式 获取 内置对象

1.当前的action 实现 SessionAware,ApplicationAware,ServletRequestAware,ServletResponseAware

2.代码示例:

public class LoginAction implements Action,SessionAware,ApplicationAware,ServletRequestAware,ServletResponseAware{


    private HttpServletRequest request;     //HttpServletRequest型变量request声明  
    private HttpServletResponse response;   //HttpServletResponse型变量response声明    
    private Map session;            //HttpSession型变量session声明  
    private Map application;        //Application型变量application声明  
    //测试action是否每次新生成的一个实例
//  public LoginAction() {
//      // TODO Auto-generated constructor stub
//      System.out.println(this);
//  }

    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub


        return "error";
    }

    @Override
    public void setServletResponse(HttpServletResponse response) {
        // TODO Auto-generated method stub
        this.response = response;
    }

    @Override
    public void setServletRequest(HttpServletRequest request) {
        // TODO Auto-generated method stub
        this.request = request;
    }

    @Override
    public void setApplication(Map<String, Object> application) {
        // TODO Auto-generated method stub
        this.application =  application;
    }

    @Override
    public void setSession(Map<String, Object> session) {
        // TODO Auto-generated method stub
        this.session = session;
    }

}

—————————-IOC 思想 重点
http://stamen.iteye.com/blog/1489223/
IOC :控制反转(Inversion of Control,英文缩写为IoC)
控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。依赖注入应用比较广泛。

IoC模式看做是工厂模式的升华,可以把IoC看作是一个大工厂,只不过这个大工厂里要生成的对象都是在XML文件中给出定义的,然后利用Java 的“反射”编程,根据XML中给出的类名生成相应的对象。从实现来看,IoC是把以前在工厂方法里写死的对象生成代码,改变为由XML文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。

主要可以划分为三种类型:构造函数注入、属性注入和接口注入

———————————-小案例
数据展现:详见代码示例
http://kingxss.iteye.com/blog/1622455

5.拦截器 如何自定义拦截器 (重点)
概念:就在请求到某个action的之前或者之后 进行一些拦截 ,拦截器 是AOP的 一种实现方式

AOP面向切面编程, 具体的实现方式还是通过代理模式来实现的
http://www.cnblogs.com/yanbincn/archive/2012/06/01/2530377.html AOP
http://www.blogjava.net/i369/articles/162407.html 拦截器

拦截器看一下struts-defalut.XML

1.自定义拦截器
创建一个类来实现Interceptor 接口

public class MyInterceptor  implements  Interceptor{

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void init() {
        // TODO Auto-generated method stub

    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        // TODO Auto-generated method stub
        String result = invocation.invoke();
        System.out.println(result);
        return result;
    }

}
  1. 注册拦截器

2.1 针对某一个action 进行拦截

     <package  name="zr"  extends="struts-default">
        <interceptors>
               <interceptor name="test" class="com.zr.interceptor.MyInterceptor"/>
        </interceptors>
            <action name="abc"  class="com.zr.controller.ShowController"  method="showMsg">
                <result name="success">index.jsp</result>
                <interceptor-ref name="test"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </action>
       </package>

2.2 通过定义拦截器栈 对package下面的所有action 都经过这个拦截器栈

   <struts>
       <constant name="struts.configuration.xml.reload" value="true"/>
       <package name="zr"  extends="struts-default">
        <interceptors>
               <interceptor name="test" class="com.zr.interceptor.MyInterceptor"/>
               <interceptor name="test2" class="com.zr.interceptor.MyInterceptor2"/>
               <interceptor-stack name="mystack">
                  <interceptor-ref name="test"></interceptor-ref>
                  <interceptor-ref name="test2"></interceptor-ref>
                  <interceptor-ref name="defaultStack"/>
               </interceptor-stack>
        </interceptors>
          <default-interceptor-ref name="mystack"></default-interceptor-ref><!-- 需要放在action上面-->
            <action name="abc"  class="com.zr.controller.ShowController"  method="showMsg">
                <result name="success">index.jsp</result>
            </action>
       </package>
</struts> 

注意: 在引入拦截器栈的时候,需要放在action上面

valueStack 和OGNL (重点)
值栈 就是存储数据的空间 线程安全

Struts2会为每个请求创建一个新的值栈,也就是说,栈和请求是一一对应的,不同的请求,值栈也不一样,而值栈封装了一次请求所有需要操作的相关的数据。

狭义值栈: 狭义值栈主要用来存放动态EL(表达式语言)运算需要的值和结果,当然OgnlValueStack对象主要是用来支持OGNL(对象图导航语言)运算的。

换句话说: 也就 请求action 中产生的数据或者获取的数据,最终都是放到Ation 对应的值栈当中
代码示例:
//狭义的值栈

ActionContext   ac =   ActionContext.getContext();
       ValueStack    vs =  ac.getValueStack();
       vs.set("uname","wwj");

注意:前台页面取值需要用S标签 当然注意要引入S标签

<s:property  value="uname"/>

—————–ognl 对象图形导航语言
ognl 对存放的数据进行取值 是一种表达式

request #session #application 后面跟点语法就可以了

注意:这里访问的是actioncontext里面的数据

http://blog.csdn.net/tjcyjd/article/details/6850203/ 参考资料

注意:通过使用#attr 取数据 page - request -session -application

ognl 访问静态方法和属性

1.struts.xml 中配置

<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>

2.页面中使用OGNL表达式访问

        <!-- 访问静态属性和方法 -->
    <s:property value="@com.zr.controller.MyStatic@name"/><br/>
    <s:property value="@com.zr.controller.MyStatic@showMsg()"/>

3.ongl 访问javabean 对象 和 集合 ,Map
模拟数据:

          this.setStudent1(new Student(1, "wwj"));
           Map<String,Student>  s2  =new HashMap<String,Student>();
           s2.put("student2", new Student(2,"xyz"));
           this.setStudent2(s2);
           List<Student>  students = new ArrayList<Student>();
           students.add(new Student(3,"abc"));
           this.setStudents(students);

页面获取:

      <!-- 访问对象 -->
    对象:<s:property  value="student1.sname"/><br>
    <!-- 访问集合 -->
    集合:<s:property  value="students[0].sname"/><br>
    <!-- 访问Map-->
    map:<s:property  value="student2.student2.sname"/

struts2标签

http://www.cnblogs.com/langtianya/archive/2013/03/18/2965878.html 参考资料

http://jimingsong.iteye.com/blog/1582939

根据功能划分: 数据标签 控制标签 界面标签 其它一些标签

优点:比JSTL 强大 缺点 :性能特别低 一般在开发中不太常用

数据标签 :
Propetry 输出值
set 设置值
Bean 定义java对象
Date 日期
Debug调试
url标签
Include 标签

单独 Debug 标签使用 在页面 使用 进行调试 : 看值是否在valueStack中

控制标签:

ifelse 判断标签
Iterator 循环
Append 叠加
Generator 分隔标签
Merge 组合
sort 排序标签
subset 截取标签

循环标签:

    <s:iterator var="student"  value="students">
      <s:property  value="#student.sname"/>
    </s:iterator>

界面标签:
Form 表单
text 文本
radios 单选
checkbox 标签
select 下拉

其它标签:
UpdownSelect
optiontransferselect

struts2国际化:

http://1250605829.iteye.com/blog/1595275 参考

1.
配置国际化的属性文件
resource_en_US.properties
resource_zh_CN.properties

uname=Uname
upsw=Upassword

2.配置struts.xml文件

 <!-- 添加国际化资源文件配置 -->
      <constant name="struts.custom.i18n.resources" value="resource"></constant> 

value 里面的值 对应 resource(可以随便取)

3.标签都是采用s标签

     <s:form id="loginform" action="login" method="post">
          <s:text name="uname"></s:text>
          <input  type="text"/> 
          <s:text name="upsw"></s:text>
          <input  type="text"/> 
       </s:form>

struts2 验证
实现的效果跟我们前台使用js进行验证是一个效果
1.编写提交文件

<s:form id="loginform" action="login" method="post">
              <s:textfield name="uname"  label="用户名"></s:textfield>
              <s:submit  value="提交"></s:submit>
</s:form>

2.配置对应的请求验证器XML文件
注意:要保证跟action类同级
比如action 叫做 abc 那么对应验证文件就叫做 abc–validation.xml
编写XML中的验证规则:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
 <!-- 编写验证 --> 
 <validators>
     <!-- 对哪个字段进行验证-->
     <field name="uname">  
        <!-- 配置必填字符串校验器 --> 
         <!-- 这里相当于是对字符长度的验证--> 
        <field-validator type="requiredstring">  
            <param name="minLength">5</param> 
            <param name="maxLength">10</param> 
            <message>对不起长度不满足要求</message>  
        </field-validator>  
    </field> 
 </validators> 

3.
如果不满足条件 配置返回结果 为 input 返回你自己验证的页面
提交测试

注:在xwork核心包下面 validator包下面的defalut-xml 可以查询到默认Struts2 为我们提供的验证
注:验证还可以自定义

struts2 文件上传和下载
—————-文件上传
1.编写页面

     <!--enctype 必需配置成   这个需要不是针对框架的。文件上传必需有这个  -->
       <form action="upload" method="post" enctype="multipart/form-data">
            请选择需要上传的文件:<input type="file"   name="fname"/>  
            <input type="submit" value="提交">   
       </form>

2.配置对应的XML文件=

    <!-- 指定允许上传的文件最大字节数。默认值是2097152(2M) -->
    <constant name="struts.multipart.maxSize" value="10701096"/>
    <!-- 设置上传文件的临时文件夹,默认使用javax.servlet.context.tempdir -->
    <constant name="struts.multipart.saveDir " value="d:/tmp" />
   (可选)

    <package name="zr" extends="struts-default">
          <!-- 接收文件上传的请求 -->
           <action name="upload"  class="com.zr.controller.UploadController" method="upload">
               <result name="success">index.jsp</result>
           </action>
    </package>

3.编写对应的action类

public class UploadController extends ActionSupport{

    //通过文件上传,struts2会帮你接受上传的一些数据
    //文件  fname 跟  页面中file 定义的name名字一致的
    private   File  fname;
    //文件名    必需后缀加上FileName
    private   String fnameFileName;
    //文件类型  必需后缀加上ContentType
    private   String fnameContentType;

    (自行get set)

    public  String upload(){
    //获取服务器的地址    webapps/项目名/users
        String path  = ServletActionContext.getServletContext().getRealPath("/users");
        System.out.println(path);
        //将文件拷贝到需要的路径下面
        //1.先创建File 对象
        File  f = new  File(path);
        //2.执行拷贝的方法  (io组件当中 FileUtils 类 )
        try {
            //FileUtils.copyFileToDirectory(fname, f);
             FileUtils.copyFile(fname, new File(f,fnameFileName));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return  SUCCESS;
    }
}

—注明 多文件上传也就是接收的参数 为数组
//——————–分割线

    //文件
        private   File[]  fnames;
        //文件名
        private   String[] fnamesFileName;
        //文件类型
        private   String[] fnamesContentType;

———————文件下载:

  1. 发送请求下载否文件
    <a href="download">点击我下载</a>

2.配置Struts.xml文件 接受对应下载请求

<!-- 接受下载的请求 -->  设置返回类型为流的形式
           <action name="download"  class="com.zr.controller.DownloadController">
               <result type="stream">
                      <!-- 默认是找getInputstream 方法  但是可以配置由哪个方法来处理流-->
                      <!--这里命名为download 那么anction 中必需方法命名为getDdownload-->
                 <param name="inputName">download</param>
              <!-- 提示用户下载  attachment;filename= 不变  等号跟文件名-->
             <param name="contentDisposition">attachment;filename="${filename}"</param>
               </result>
           </action>

3.编写getDownload的方法 返回类型 是 流

public  InputStream getDownload(){
        //模拟已经知道文件路径的地址
        String fpath = ServletActionContext.getServletContext().getRealPath("/users")+"\\abc.xls";
        File f =  new  File(fpath);
        this.setFilename("bcd");
        FileInputStream in = null;
        try {
            in = new FileInputStream(f);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return in;
    }

4.测试下载

Struts2学习笔记(2)

标签:

原文地址:http://blog.csdn.net/nogfexception/article/details/51743572

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!