`
ccii
  • 浏览: 56632 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Struts2

阅读更多
一、Struts2概述
  Struts2 是Apache软件基金会(ASF)赞助的一个开源项目,使用Struts2的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间。如果我们想混合使用Servlets和JSP的优点来建立可扩展的应用,Struts2是一个不错的选择。

二、Struts2工作原理

如图,Struts2工作原理大概分为以下几个步骤:
1.客户端初始化一个指向Servlet容器(例如Tomcat)的请求。
2.这个请求经过一系列的过滤器(Filter)(ActionContextCleanUp,SiteMesh,etc等)。
3.接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求调用那个Action。
4.FilterDispatcher将控制权委派给ActionProxy,ActionProxy通过Configuration Manager读取框架的配置文件,然后创建一个ActionInvocation实例。
5.ActionInvocation调用Action,Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。

三、Struts2相对于Struts1的改进
1.在Action的实现方面
  Struts1要求必须统一扩展自Action类,而Struts2中可以是一个普通的POJO。
2.线程模型方面
  Struts1的Action是单实例的,一个Action的实例处理所有的请求。Struts2的Action是一个请求对应一个实例(每次请求时都新new出一个对象),没有线程安全方面的问题。
3.Servlet依赖方面
  Struts1的Action依赖于Servlet API,比如Action的execute方法的参数就包括request和response对象。这使程序难于测试。Struts2中的Action不再依赖于Servlet API,有利于测试,并且实现TDD。
4.封装请求参数
  Struts1中强制使用ActionForm对象封装请求的参数。Struts2可以选择使用POJO类来封装请求的参数,或者直接使用Action的属性。
5.表达式语言方面
  Struts1中整合了EL,但是EL对集合和索引的支持不强,Struts2整合了OGNL(Object Graph NavigationLanguage)。绑定值到视图技术
  Struts1使用标准的JSP,Struts2使用“ValueStack”技术。
6.类型转换
  Struts1中的ActionForm基本使用String类型的属性。Struts2中使用OGNL进行转换,可以更方便的使用。Struts1中支持覆盖validate方法或者使用Validator框架。Struts2支持重写validate方法或者使用XWork的验证框架。
7.Action执行控制的对比
  Struts1支持每一个模块对应一个请求处理,但是模块中的所有Action必须共享相同的生命周期。Struts2支持通过拦截器堆栈为每一个Action创建不同的生命周期。

四、Struts2开发示例
1. Struts2的下载
  官方下载地址:http://struts.apache.org/download.cgi
  Struts2完整版结构如下:apps(应用示例),docs(帮助文档,API),lib(核心类库),src(全部源码)

2. 导入struts2核心类库到项目
  基本包包括:antlr-2.7.2.jar,commons-fileupload-1.3.jar,commons-io-2.0.1.jar,commons-logging-1.1.3.jar,commons-lang3-3.1.jar,freemarker-2.3.19.jar,javassist-3.11.0.GA.jar,ognl-3.0.6.jar,struts2-core-2.3.15.3.jar,
xwork-core-2.3.15.3.jar,如需使用Struts2的更多特性,则需导入其它jar包

3. 在web.xml中配置Struts2的核心Filter

    <!-- 定义Struts2的核心Filter -->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <!-- 让Struts2的核心Filter拦截所有请求 -->
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

4. 创建登陆页面login.jsp,测试Struts2

<script type="text/javascript">
    function regist(){
        //获取页面的第一个表单
        targetForm = document.forms[0];
        //动态修改表单的action属性
        targetForm.action = "regist";
    }
</script>
<body bgcolor="pink">
    <center>
        用户登陆<br><hr>
        <form action="login">
            账 号:<input type="text" name="username"><br>
            密 码:<input type="text" name="password"><br>
            <input type="submit" value="登陆">
            <input type="submit" value="注册" onclick="regist();">
        </form>
    </center>
</body>

5. 为Struts2添加配置文件struts.xml

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
    "http://struts.apache.org/dtds/struts-2.1.7.dtd">
<!-- 指定Struts 2配置文件的根元素 -->
<struts>
    <!-- 指定全局国际化资源文件 -->
    <constant name="struts.custom.i18n.resources" value="mess"/>
    <!-- 指定国际化编码所使用的字符集 -->  
    <constant name="struts.i18n.encoding" value="GBK"/>
    <!-- 所有的Action定义都应该放在package下 -->
    <package name="userManager" extends="struts-default">
        <!-- 不配置method属性,交给默认的execute()方法处理 -->
        <action name="login" class="test.action.LoginAction">
            <!-- 定义三个逻辑视图和物理资源之间的映射 -->      
            <result name="input">/login.jsp</result>
            <result name="error">/error.jsp</result>
            <result name="success">/welcome.jsp</result>
        </action>
        <!-- 配置method属性,交给regist()方法处理 -->
        <action name="regist" class="test.action.LoginAction" method="regist">
            <result name="success">/welcome.jsp</result>
        </action>
    </package>
    <!-- 导入其它完整的配置文件 -->
    <include file="struts-xxx.xml"></include>
</struts>

6. 编写Action处理类BaseAction.java,LoginAction.java

/////////////////// 1.BaseAction
package test.action;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class BaseAction extends ActionSupport {
    
    private transient HttpServletRequest request = null;
    private transient HttpServletResponse response = null;
    private transient ServletContext servletContext = null;
    private transient HttpSession session = null;
    
    public void setRequest(HttpServletRequest request) {
        this.request = request;
    }
    public void setResponse(HttpServletResponse response) {
        this.response = response;
    }
    public void setServletContext(ServletContext servletContext) {
        this.servletContext = servletContext;
    }
    public void setSession(HttpSession session) {
        this.session = session;
    }
    public HttpServletRequest getRequest(){
        if(request != null){
            return request;
        }
        return ServletActionContext.getRequest();
    }
    public HttpServletResponse getResponse(){
        if(response != null){
            return response;
        }
        return ServletActionContext.getResponse();
    }
    public ServletContext getServletContext(){
        if(servletContext != null){
            return servletContext;
        }
        return ServletActionContext.getServletContext();
    }
    public HttpSession getSession(){
        if(session != null){
            return session;
        }
        return getRequest().getSession();
    }
}


///////////////// 2. LoginAction
package test.action;

public class LoginAction extends BaseAction{
    //定义封装请求参数的username和password属性
    private String username;
    private String password;
    
    public String getUsername(){
        return username;
    }
    public void setUsername(String username){
        this.username = username;
    }
    public String getPassword(){
        return password;
    }
    public void setPassword(String password){
        this.password = password;
    }
    //注册Action
    public String regist() throws Exception {
        System.out.println(this.getRequest().getAttribute(&quot;username&quot;));
        this.getRequest().setAttribute(&quot;username&quot;, &quot;regist&quot;);
        return SUCCESS;
    }
    //默认的登陆Action
    public String execute() throws Exception {
        // 1. 通过request对象得到表单的值
        System.out.println(this.getRequest().getParameter(&quot;username&quot;));
        // 2. 直接通过getter和setter得到表单的值
        if (getUsername().equals(&quot;a&quot;)&amp;&amp; getPassword().equals(&quot;a&quot;)){
            // 3. 设置、得到session的值
            this.getSession().setAttribute(&quot;username&quot;, &quot;ok&quot;);
            System.out.println(this.getSession().getAttribute(&quot;username&quot;));
            // 4. 设置响应的字符串
            this.getResponse().setCharacterEncoding(&quot;UTF-8&quot;);
            this.getResponse().getWriter().print(&quot;ccccc&quot;);
            return SUCCESS;
        } else {
            return ERROR;
        }
    }
}


7. 其它跳转页面welcome.jsp

<body>
      登陆成功!<%=request.getAttribute("username")%><br>
      <a href="login.jsp">退出</a><hr>
</body>

五、Struts2的文件上传和下载
Struts2的文件上传:
1. 测试文件上传页面upload.jsp
  此处使用Struts2标签来生成上传文件的表单,为了让浏览器采用二进制数据的方式把数据发送到服务器,我们必须把表单的method设置为POST,将enctype设置为multipart/form-data。jsp代码如下:

<body>
<s:form action="uploadPro" method="post" enctype="multipart/form-data">
    <s:file name="upload" label="选择文件"/><br />
    <s:submit value="上传"/>
</s:form>
</body>

2. 实现文件上传的Action(UploadAction.java)
  Action实现类其实非常简单,只需要定义三个属性接收文件参数即可,一是类型为File的xxx封装文件内容,二是String类型的xxxFileName封装文件名,三是String类型的xxxContentType封装文件类型。代码如下:
package test;
import com.opensymphony.xwork2.ActionSupport;
import java.io.*;
public class UploadAction extends ActionSupport{
    //封装上传文件域
    private File upload;
    //封装上传文件类型
    private String uploadContentType;
    //封装上传文件名
    private String uploadFileName;
    public void setUpload(File upload) {
        this.upload = upload;
    }
    public File getUpload(){
        return (this.upload);
    }
    public void setUploadContentType(String uploadContentType){
        this.uploadContentType = uploadContentType;
    }
    public String getUploadContentType(){
        return (this.uploadContentType);
    }
    public void setUploadFileName(String uploadFileName){
        this.uploadFileName = uploadFileName;
    }
    public String getUploadFileName(){
        return (this.uploadFileName);
    }
    @Override
    public String execute() throws Exception{
        //将文件写入服务器,没有此文件时新建
        File file = new File("h:\\AAA\\"+getUploadFileName());
        FileOutputStream fos = new FileOutputStream(file);
        FileInputStream fis = new FileInputStream(getUpload());
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = fis.read(buffer)) > 0){
            fos.write(buffer , 0 , len);
        }
        fos.close();
        return SUCCESS;
    }
}


3. 配置文件上传的Action(struts.xml)

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
    "http://struts.apache.org/dtds/struts-2.1.7.dtd">   
<struts>
    <constant name="struts.custom.i18n.resources" value="mess"/>
    <!-- 设置该应用使用的解码集 -->
    <constant name="struts.i18n.encoding" value="GBK"/>
    <package name="lee" extends="struts-default">
        <!-- 配置处理文件上传的Action -->
        <action name="uploadPro" class="test.UploadAction">
            <!-- 配置Struts 2默认的视图页面 -->
            <result>/upload.jsp</result>   
        </action>
    </package>
</struts>

4. 实现文件过滤
  方法一:直接在Action中判断文件的类型是否为允许类型
  方法二:拦截器实现文件过滤,如下:

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
    "http://struts.apache.org/dtds/struts-2.1.7.dtd">   
<struts>
    <constant name="struts.custom.i18n.resources" value="mess"/>
    <!-- 设置该应用使用的解码集 -->
    <constant name="struts.i18n.encoding" value="GBK"/>
    <package name="lee" extends="struts-default">
        <!-- 配置处理文件上传的Action -->
        <action name="uploadPro" class="org.crazyit.app.action.UploadAction">
            <!-- 配置fileUpload的拦截器 -->
            <interceptor-ref name="fileUpload">
                <!-- 配置允许上传的文件类型 -->
                <param name="allowedTypes">image/png,image/gif,image/jpeg</param>
                <!-- 配置允许上传的文件大小 -->
                <param name="maximumSize">2000</param>
            </interceptor-ref>
            <!-- 配置系统默认的拦截器 -->
            <interceptor-ref name="defaultStack"/>
            <!-- 配置Struts 2默认的视图页面 -->
            <result>/WEB-INF/content/succ.jsp</result>
        </action>
    </package>
</struts>

Struts2的文件下载:
1. 测试文件下载jsp页面

<body>
    <ul><li>下载:<a href="download.action">下载文件</a></li></ul>
</body>

2. 实现文件下载的Action(FileDownloadAction.java)

package test;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.*;
public class FileDownloadAction extends ActionSupport {
    //该属性可以在配置文件中动态指定该属性值
    private String inputPath;
    //依赖注入该属性值的setter方法
    public void setInputPath(String value){
        inputPath = value;
    }
    /*
     * 定义一个返回InputStream的方法,该方法将作为被下载文件的入口,
     * 且需要配置stream类型结果时指定inputName参数,inputName参数的值就是方法去掉get前缀、首字母小写的字符串
     */
    public InputStream getTargetFile() throws Exception {
        //ServletContext提供getResourceAsStream()方法返回指定文件对应的输入流
        return ServletActionContext.getServletContext().getResourceAsStream(inputPath);
    }
}


3. 配置文件下载的Action(struts.xml)

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
    "http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
    <constant name="struts.custom.i18n.resources" value="mess"/>
    <constant name="struts.i18n.encoding" value="GBK"/>
    <package name="lee" extends="struts-default">
        <action name="download" class="test.FileDownloadAction">
            <param name="inputPath">\images\aaa.jpg</param>
            <!-- 配置结果类型为stream的结果 -->
            <result name="success" type="stream">
                <!-- 指定下载文件的文件类型 -->
                <param name="contentType">image/jpg</param>
                <!-- 指定由getTargetFile()方法返回被下载文件的InputStream -->
                <param name="inputName">targetFile</param>
                <param name="contentDisposition">filename="hap.jpg"</param>
                <!-- 指定下载文件的缓冲大小 -->
                <param name="bufferSize">4096</param>
            </result>
        </action>
    </package>
</struts>

六、Struts2返回JSON数据示例
1. 导包
  除导入Struts2基本包以外还要导入struts2-json-plugin-2.3.15.3.jar

2. 实现Action(JSONExample.java)
package test;
import java.util.HashMap;
import java.util.Map;
import com.opensymphony.xwork2.Action;
import org.apache.struts2.json.annotations.JSON;
public class JSONExample{
    //模拟处理结果的属性
    private int[] ints = {10, 20};
    private Map<String , String> map = new HashMap<String , String>();
    private String customName = "顾客";
    //封装请求参数的三个属性
    private String field1;
    //'transient'修饰的属性不会被序列化
    private transient String field2;
    //没有setter和getter方法的字段不会被序列化
    private String field3;
    public String execute(){
        field2 = "333";
        map.put("name", "疯狂Java讲义");
        return Action.SUCCESS;
    }
    //使用注释语法来改变该属性序列化后的属性名
    @JSON(name="newName")
    public Map getMap(){
        return this.map;
    }
    //customName属性的setter和getter方法
    public void setCustomName(String customName){
        this.customName = customName;
    }
    public String getCustomName(){
        return this.customName;
    }
    //field1属性的setter和getter方法
    public void setField1(String field1){
        this.field1 = field1;
    }
    public String getField1(){
        return this.field1;
    }
    //field2属性的setter和getter方法
    public void setField2(String field2){
        this.field2 = field2;
    }
    public String getField2(){
        return this.field2;
    }
    //field3属性的setter和getter方法
    public void setField3(String field3){
        this.field3 = field3;
    }
    public String getField3(){
        return this.field3;
    }
}


3. 配置Action(struts.xml)

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
    "http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
    <constant name="struts.i18n.encoding" value="UTF-8"/>
    <package name="example"  extends="json-default">
        <action name="JSONExample" class="test.JSONExample">
            <!-- 配置类型的json的Result -->
            <result type="json">
                <!-- 为该Result指定参数 -->
                <param name="noCache">true</param>
                <param name="contentType">text/html</param>
                <!-- 设置只返回Action的map属性 -->
                <!--  param name="root">map</param -->
            </result>
        </action>
    </package>
</struts>

4. 测试返回结果
  浏览器输入: http://localhost:8080/TestStrutsJSON/example/JSONExample(项目路径+Action配置文件包名+Action名)测试得到的JSON数据。
  • 大小: 121.5 KB
分享到:
评论

相关推荐

    Struts2漏洞检查工具Struts2.2019.V2.3

    Struts2是一款非常流行的Java Web框架,用于构建企业级应用。然而,随着时间的推移,Struts2在安全方面暴露出了一些重要的漏洞,这给使用该框架的系统带来了潜在的安全风险。"Struts2漏洞检查工具Struts2.2019.V2.3...

    struts2jar包

    Struts2是一个强大的Java EE应用程序框架,主要用于构建企业级的Web应用。它的核心是MVC(Model-View-Controller)设计模式,可以帮助开发者组织代码,提高开发效率,并且提供了丰富的特性来支持表单验证、国际化、...

    struts1和struts2的区别

    ### Struts1与Struts2的主要区别 #### 概述 Apache Struts 是一个用于构建企业级Java Web应用的开源框架。它分为两个版本:Struts1 和 Struts2。虽然两者都基于模型-视图-控制器(MVC)设计模式,但它们之间存在...

    struts2项目开发

    Struts2 项目开发 Struts2 是一个基于 Java Web 的框架,广泛应用于 Web 应用程序的开发。下面将从 Struts2 项目开发的角度,详细介绍 Struts2 框架的应用、开发流程、技术架构、实践经验等方面的知识点。 项目...

    留言板留言板struts2留言板struts2

    这个"留言板留言板struts2"项目,显然是一个基于Struts2实现的简单留言板系统,旨在展示Struts2的核心功能和开发流程。下面将详细介绍Struts2框架以及在该项目中可能涉及的关键知识点。 1. **Struts2框架概述**:...

    Struts2视频教程

    ### Struts2核心知识点解析 #### 一、Struts2框架概述 - **定义与特点**:Struts2是一款基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架,它继承了Struts1的优点,同时在设计上更加灵活、易用,...

    struts2-core.jar

    struts2-core-2.0.1.jar, struts2-core-2.0.11.1.jar, struts2-core-2.0.11.2.jar, struts2-core-2.0.11.jar, struts2-core-2.0.12.jar, struts2-core-2.0.14.jar, struts2-core-2.0.5.jar, struts2-core-2.0.6.jar,...

    Struts2VulsTools-Struts2系列漏洞检查工具

    该工具的打开路径为:\Struts2VulsTools-2.3.20190927\Test\bin\Release\Text.exe 2019-09-25: 优化部分EXP在部分情况下被WAF拦截的问题,提高检测成功率,优化自定义上传路径exp,文件所在目录不存在时自动创建...

    Struts2接口文档

    Struts2是一个强大的Java web应用程序开发框架,它基于Model-View-Controller(MVC)设计模式,旨在简化创建用户交互式、数据驱动的web应用的过程。这个“Struts2接口文档”是开发者的重要参考资料,提供了关于...

    struts2-showcase.rar

    Struts2-showcase是一个用于演示和学习Apache Struts2框架功能的开源项目。这个压缩包“struts2-showcase.rar”包含了完整的源代码,旨在帮助开发者深入理解Struts2框架的工作原理及其各种特性。以下是对Struts2和...

    struts2的各种jar包

    Struts2是一个强大的Java web应用程序框架,用于构建和管理MVC(模型-视图-控制器)架构的应用程序。它在Java社区中广泛使用,因其灵活性、可扩展性和丰富的插件库而受到赞誉。Struts2的核心是Action类,它处理HTTP...

    Struts2_s2-016&017&ognl2.6.11_patch漏洞补丁

    -- 为修复struts2 s2-016、s2-017漏洞,重写DefaultActionMapper --&gt; &lt;bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="myDefaultActionMapper" class=...

    Struts2+Jquery+Ajax

    "struts2 jar"文件包含了Struts2框架的核心库,可能包括struts2-core、struts2-convention、struts2-json-plugin等依赖,这些是开发Struts2应用必不可少的组件。 "Struts2"可能是项目实例代码,包括Action类、视图...

    struts2所有jar包程序文件

    Struts2是一个非常著名的Java Web开发框架,由Apache软件基金会维护。它基于MVC(Model-View-Controller)设计模式,极大地简化了构建基于Java EE的Web应用程序的过程。本资源包含"struts2所有jar包程序文件",是...

    Struts2教学视频

    Struts2是一个强大的Java web开发框架,用于构建可维护、可扩展且结构良好的应用程序。它在MVC(Model-View-Controller)设计模式的基础上提供了一种实现方式,使得开发者能够更方便地处理用户请求,控制业务逻辑,...

    张龙圣思园struts2学习笔记word

    Struts2是Apache软件基金会下的一个开源框架,主要用于构建企业级的Java web应用程序。张龙圣思园的Struts2学习笔记,无疑为Java开发者提供了一份宝贵的参考资料,它可能涵盖了Struts2的基础概念、核心组件、配置...

    struts2 chm 帮助文档

    struts2 chm 程序包 org.apache.struts2 接口概要 接口 说明 StrutsStatics Constants used by Struts. 类概要 类 说明 RequestUtils Request handling utility class. ServletActionContext Web-specific ...

    Struts2开发常用jar包

    包含struts2-core-2.5.10.1.jar,struts2-jfreechart-plugin-2.5.10.1.jar,struts2-json-plugin-2.5.10.1.jar,struts2-junit-plugin-2.5.10.1.jar,struts2-bean-validation-plugin-2.5.10.1.jar,struts2-cdi-...

    最新版本的Struts2+Spring4+Hibernate4框架整合

    整合使用最新版本的三大框架(即Struts2、Spring4和Hibernate4),搭建项目架构原型。 项目架构原型:Struts2.3.16 + Spring4.1.1 + Hibernate4.3.6。 此外,还有:log4j、slf4j、junit4、ehcache等知识点。 项目...

    全网最全Struts 2 全版本漏洞检测工具,最新struts漏洞更新

    Struts 2是一款基于Java的开源MVC框架,它在Web应用开发中广泛使用,但同时也因其复杂的架构和历史遗留问题,成为了网络安全的焦点。这个标题提到的是一个全面的Struts 2漏洞检测工具,旨在帮助开发者和安全专家识别...

Global site tag (gtag.js) - Google Analytics