Struts2框架(二)

一、Struts2配置

1.Struts2的Action的开发的几种方式

  方式1:继承ActionSupport。(推荐使用)如果使用Struts2的数据校验功能,必须继承此类。

  方式2:实现Action接口。

  方式3:不继承任何类,不实现任何接口。

2.通配符

  在Struts2的配置信息中,可以用*与{1}可以优化配置。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <package name="config" namespace="/user" extends="struts-default" abstract="false">

        <!--
        <action name="login" class="cn.itcast.a_config.UserAction" method="login">
            <result name="success">/index.jsp</result>
        </action>
        <action name="register" class="cn.itcast.a_config.UserAction" method="register">
            <result name="success">/index.jsp</result>
        </action>
         -->        

         <!-- 使用通配符优化上面的步骤 -->
         <!-- http://localhost:8080/struts02/user_login -->
         <action name="user_*" class="cn.itcast.a_config.UserAction" method="{1}">
            <result name="{1}">/{1}.jsp</result>
        </action>

    </package>    

</struts>

3.Struts2中路径匹配原则

  http://localhost:8080/struts02/user/a/b/user_login

  Tomcat:

    localhost:找到访问哪一台机器

    8080:找到tomcat

    struts02:找到项目名称

    /user/a/b:先看有没有这个名称空间,没找到,继续向下。找到就返回。

    /user/a:先看有没有这个名称空间,没找到,继续向下。找到就返回。

    /user:先看有没有这个名称空间,没找到,继续向下。找到就返回。

    /:默认名称空间,还没找到,报错!  找到就返回。

4.Struts2常量

  Struts中默认访问后缀:

    Struts1中默认访问后缀是*.do

    Struts2中默认访问后缀是*.action

  如何修改默认访问后缀:

    1.Struts2的.action访问后缀在哪里定义?

      struts2-core-2.3.24.1.jar/org.apache.struts2/default.properties

      struts.action.extension=action

    2.在Struts.xml中通过常量修改

      <constant name="struts.action.extension" value="action,do,"></constant>

      指定访问后缀为action/do/没有访问后缀都可以

      value="action,do,"  访问后缀:action/do/不带后缀

      value="action,do"  访问后缀:action或do

      value="action"      访问后缀:只能是action

指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法和freemarker、velocity的输出。
<constant name="struts.i18n.encoding" value="UTF-8"/>

自定义后缀修改常量
<constant name="struts.action.extension" value="do"/>

设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭。
<constant name="struts.configuration.xml.reload" value="true"/>

开发模式下使用,这样可以打印出更详细的错误信息
<constant name="struts.devMode" value="true"/>

默认的视图主题
<constant name="struts.ui.theme" value="simple"/>

与spring集成时,指定由spring负责action对象的创建
<constant name="struts.objectFactory" value="spring"/>

该属性设置Struts2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法的调用,则可设置该属性为false。
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>

上传文件的大小限制
<constant name="struts.multipart.maxSize" value="10701096"/>

动态方法调用语法:actionName + !即为动态方法调用,如:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <package name="config2" namespace="/" extends="struts-default">

        <!-- 动态方法调用: http://locahost:8080/struts02/user!login -->
        <action name="user" class="cn.yly.UserAction">
            <result name="success">/index.jsp</result>
        </action>

    </package>    

</struts>

5.全局跳转视图配置、配置的各项默认值

  全局视图配置:

                <!-- 配置全局跳转视图 -->
        <global-results>
            <result name="success">/index.jsp</result>
        </global-results>            

  配置各项目默认值:

<!-- 配置各项默认值 -->
         <!--
              name  只配置了访问路径名称
              class 默认执行的action在struts-default有配置
                      <default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
              method  默认为execute
              默认的方法execute返回值为success,对应的页面去全局视图找。

          -->
         <action name="test"></action>
<!-- 什么情况不配置class? 即处理的aciton -->
        <!-- 答案: 当只是需要跳转到WEB-INF下资源的时候。 -->
         <action name="test2">
             <result name="success">/WEB-INF/index.jsp</result>
         </action>

二、Struts中数据处理

  对数据操作的所有方法:(把数据保存到域中)

  方式一:直接获取servletapi。核心类:ServletActionContext提供的静态方法。

  方式二:通过ActionContext获取不同(代表request/session/application)的map。

  方式三:实现接口的方法:(RequestAware / SessionAware / ApplicationAware)。

// 1. 请求数据封装; 2. 调用Service处理业务逻辑,拿到结果数据

        // 3. 数据保存到域中

        // Struts中对数据操作,方式1: 直接拿到ServletApi, 执行操作
        HttpServletRequest request = ServletActionContext.getRequest();
        HttpSession session = request.getSession();
        ServletContext application = ServletActionContext.getServletContext();
        // 操作
        request.setAttribute("request_data", "request_data1");
        session.setAttribute("session_data", "session_data1");
        application.setAttribute("application_data", "application_data1");
// 【推荐:解耦的方式实现对数据的操作】
        // Struts中对数据操作,方式2: 通过ActionContext类
        ActionContext ac = ActionContext.getContext();
        // 得到Struts对HttpServletRequest对象进行了封装,封装为一个map
        // 拿到表示request对象的map
         Map<String,Object> request =  ac.getContextMap();
         // 拿到表示session对象的map
         Map<String, Object> session = ac.getSession();
         // 拿到表示servletContext对象的map
         Map<String, Object> application = ac.getApplication();

         // 数据
         request.put("request_data", "request_data1_actionContext");
        session.put("session_data", "session_data1_actionContext");
        application.put("application_data", "application_data1_actionContext");
/**
 * 数据处理, 方式3: 实现接口的方法
 * @author Jie.Yuan
 *
 */
public class DataAction extends ActionSupport implements RequestAware, SessionAware, ApplicationAware{

    private Map<String, Object> request;
    private Map<String, Object> session;
    private Map<String, Object> application;

    // struts运行时候,会把代表request的map对象注入
    @Override
    public void setRequest(Map<String, Object> request) {
        this.request = request;
    }

    // 注入session
    @Override
    public void setSession(Map<String, Object> session) {
        this.session = session;
    }

    // 注入application
    @Override
    public void setApplication(Map<String, Object> application) {
        this.application = application;
    }

    @Override
    public String execute() throws Exception {

         // 数据
         request.put("request_data", "request_data1_actionAware");
        session.put("session_data", "session_data1_actionAware");
        application.put("application_data", "application_data1_actionAware");
        return SUCCESS;
    }

}

三、请求数据自动封装

  方式一:JSP表单数据填充到action中的属性。一定要set方法,get方法可以不用。

  方式二:JSP表单数据填充到action的对象中的属性。对象类型一定要set和get方法。

  实现原理:参数拦截器

四、类型转换

  Struts中JSP提交的数据,struts会自动转换为action中属性的类型;对于基本数据类型以及日期类型会自动转换;日期类型只支持yyyy-MM-dd格式。

  如果是其它格式,需要自定义类型转换器:

    局部类型转换器

    全局类型转换器

  

  Struts转换器API:

    TypeConverter  转换器接口

      DefaultTypeConverter  默认类型转换器类

        StrutsTypeConverter  用户编写的转换器类,继承此类即可

  局部类型转换器类:

  转换器开发步骤:

    1.写转换器类:继承StrutsTypeConverter

    2.配置转化器类(告诉struts应用自己的转换器类)

      ==>在同包的action目录下新建一个properties文件。

      ==>命名规则:ActionClassName-conversion.properties

        举例:com.yly.type/UserAction-conversion.properties

      ==>内容:

          user.birth=转换器类全路径(com.yly.type.MyConverter)

  

  全局类型转换器类:

    需要写一个转换器,给所有的Action用!

    配置全局类型转化器:

      ==》src/xwork-conversion.properties

      ==》内容:

           java.util.Date=转换器类(com.yly.type.MyConverter)

五、文件上传

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title></title>
</head>
<body>
<form action="${pageContext.request.contextPath}/fileUploadAction" method="post" enctype="multipart/form-data">
    用户名:<input type="text" name="userName"/><br/>
    文件:<input type="file" name="file1"/><br/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>
package com.yly;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

import java.io.File;

public class UploadAction extends ActionSupport {
    private File file1;
    private String file1FileName;
    private String file1ContentType;

    public File getFile1() {
        return file1;
    }

    public void setFile1(File file1) {
        this.file1 = file1;
    }

    public String getFile1FileName() {
        return file1FileName;
    }

    public void setFile1FileName(String file1FileName) {
        this.file1FileName = file1FileName;
    }

    public String getFile1ContentType() {
        return file1ContentType;
    }

    public void setFile1ContentType(String file1ContentType) {
        this.file1ContentType = file1ContentType;
    }

    @Override
    public String execute() throws Exception {
        //获取上传的目录的路径
        String path = ServletActionContext.getServletContext().getRealPath("/upload");
        File file = new File(path, file1FileName);
        FileUtils.copyFile(file1, file);
        return "success";
    }
}

文件上传大小限制:

  Struts默认支持的文件上传最大是2M。通过常量修改:

    <constant name="struts.multipart.maxSize" value="31457280"/>

限制上传文件的类型:

  需求:只允许txt/jpg文件类型上传。

  拦截器:注入参数限制文件上传

<!-- 注意: action 的名称不能用关键字"fileUpload" -->
        <action name="fileUploadAction" class="cn.itcast.e_fileupload.FileUpload">

            <!-- 限制运行上传的文件的类型 -->
            <interceptor-ref name="defaultStack">

                <!-- 限制运行的文件的扩展名 -->
                <param name="fileUpload.allowedExtensions">txt,jpg,jar</param>

                <!-- 限制运行的类型   【与上面同时使用,取交集】
                <param name="fileUpload.allowedTypes">text/plain</param>
                -->

            </interceptor-ref>

            <result name="success">/e/success.jsp</result>

            <!-- 配置错误视图 -->
            <result name="input">/e/error.jsp</result>
        </action>

错误提示:

  当文件上传出现错误的时候,struts内部会返回input视图(错误视图),所以就需要我们在struts.xml中配置input视图对应的错误页面!

六、Struts的文件下载

package com.yly;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.RequestMap;

import java.io.File;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

/**
 * 文件下载
 * 1.显示所有要下载文件的列表
 * 2.文件下载
 */
public class DownAction extends ActionSupport {
    /**
     * 显示所有要下载的文件列表
     *
     * @return
     * @throws Exception
     */
    public String list() throws Exception {
        //得到upload目录
        String path = ServletActionContext.getServletContext().getRealPath("/upload");
        //目录对象
        File file = new File(path);
        //得到所有要下载的文件的文件名
        String[] fileNames = file.list();
        //保存
        ActionContext ac = ActionContext.getContext();
        RequestMap requestMap = (RequestMap) ac.get("request");
        requestMap.put("fileNames", fileNames);
        return "list";
    }

    //1.获取要下载文件的文件名
    private String fileName;

    public void setFileName(String fileName) {
        //处理传入的参数中文问题(get提交)
        try {
            fileName = new String(fileName.getBytes("ISO8859-1"), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
        //把处理好的文件名赋值
        this.fileName = fileName;
    }

    /**
     * 2.文件下载提交的业务方法(在struts.xml中配置返回stream)
     *
     * @return
     * @throws Exception
     */
    public String down() throws Exception {

        return "download";
    }

    //3.返回文件流的方法
    public InputStream getAttrInputStream() {
        return ServletActionContext.getServletContext().getResourceAsStream("/upload/" + fileName);
    }

    //4.下载显示的文件名(浏览器显示的文件名)
    public String getDownFileName() {
        //需要进行中文编码
        try {
            fileName = URLEncoder.encode(fileName, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
        return fileName;
    }
}
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <package name="upload" extends="struts-default">
        <action name="fileUploadAction" class="com.yly.UploadAction" method="execute">
            <result name="success">/index.jsp</result>
        </action>

        <action name="down_*" class="com.yly.DownAction" method="{1}">
            <result name="list">/list.jsp</result>

            <result name="download" type="stream">
                <!-- 运行下载的文件类型:指定为所有的二进制文件类型 -->
                <param name="contentType">application/octet-stream</param>

                <!-- 对应的是Action中的属性:返回流的属性【其实就是getAttrInputStream()】 -->
                <param name="inputName">attrInputStream</param>

                <!-- 下载头,包括:浏览器显示的文件名 -->
                <param name="contentDisposition">attachment;filename=${downFileName}</param>

                <!-- 缓冲区大小设置 -->
                <param name="bufferSize">1024</param>
            </result>
        </action>
    </package>
</struts>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>下载列表</title>
</head>
<body>
<table border="1">
    <tr>
        <th>编号</th>
        <th>文件名</th>
        <th>操作</th>
    </tr>
    <c:forEach var="fileName" items="${fileNames}" varStatus="vs">
        <tr>
            <td>${vs.count}</td>
            <td>${fileName}</td>
            <td>
                <c:url var="url" value="down_down">
                    <c:param name="fileName" value="${fileName}"></c:param>
                </c:url>
                <a href="${url}">下载</a>
            </td>
        </tr>
    </c:forEach>
</table>
</body>
</html>

    

时间: 2024-08-08 14:32:44

Struts2框架(二)的相关文章

Struts2框架中书写XML配置文件时能添加提示技巧(方案二)

1.  先在/工程名/WebRoot/WEB-INF/lib/struts2-core-2.1.8.jar中找到struts-2.1.dtd文件. 2.  在Myeclipse8.6-->Window-->Preferences 3.  在搜索框输入xml文件,找到XMLCatalog,单击XML Catalog出现如上页面,之后单击Add按钮,出现如下图: 4.  在Location中选择FileSystem,选择struts-2.1.dtd文件的位置,如果这个文件在工程里面,可以使用Wor

Struts2框架学习(二) Action

Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器拦截请求,创建代理Action对象,执行方法,返回结果,界面跳转. 拦截器解析请求路径,获取Action的名称,到配置文件中查找action的完整类名,利用反射创建对象. 每请求一次,就创建一个对象,所以action是多例的,也是线程安全的. 2,关系 请求的路径和配置文件的对应关系: 配置文件中包

我为什么支持高校的业务系统放弃Apache Struts2框架(二)

月初听闻广东某高校(中山大学)发布通知:关于停止使用Apache Struts2开发框架的通知 鉴于S2漏洞较多.维护难度较大,为防范控制网络安全风险,经研究决定,新建信息化项目不得使用S2: 在用S2的信息系统(网站)应尽快转用其他更安全的MVC框架(如Spring MVC等):从即日起,使用S2的信息系统(网站)将仅限校园网内访问. 作为信息安全爱好者,个人对学校的决定是举双手支持的,Struts 2框架在安全方面似乎有着与生俱来的缺陷,与同类开源项目相比,它的问题是在是太多了.下面说一下我

Java Struts2 (二)

二.封装请求正文到对象中(非常重要) 1.静态参数封装 在struts.xml配置文件中,给动作类注入值.调用的是setter方法. 原因:是由一个staticParams的拦截器完成注入的. 2.动态参数封装:开发时用到的 通过用户的表单封装请求正文参数. 2.1.动作类作为实体模型 实体模型:Entity,对应数据库中表的记录(注意类对应的是表结构,而对象对应的是一条记录) 原因:是由params拦截器完成的. 2.2.动作类和实体模型分开 问题: 由于我们没有初始化user对象,默认为nu

Struts2框架学习

Struts2框架 一.一个mini Struts框架的实现 1.首先遵循MVC模式创建包 2.在Struts.xml文件里配置action 3.用dom4j来解析xml 4.用filter来实现拦截作用   好处:1.降低了类与类之间的关联(解耦和)   2.如果你要增加一些功能的话  可以在filter里面增加 实现的mini Struts工程结构: 具体实现的代码: public class HelloAction { public String execute(){ System.out

自定义验证器——用Struts2框架以框架师的思维灵活做好该事情

面对的问题:自定义一个18位身份验证器,编写验证器,在validators.xml文件中进行注册.在验证配置文件中使用? 第一部分:理解Struts2中自带的验证器 第二部分:怎样通过服务器(后台),再次对前台的数据进行验证 第三部分:用Struts2来自定义验证器(问题解决方案) 第一部分:理解Struts2中自带的验证器 Struts2框架中自带的后台服务器验证分为两种:声明式验证和编程式验证 u  声明式验证(重点) ?  对哪个 Action 或 Model 的那个字段进行验证 ?  使

struts2 框架 的环境搭建 与配置

一,Struts2简介: 1,来由:Struts(金属支架),在程序中表示起支撑作用的通用程序代码,Struts2是在Struts1框架的基础上融合了WebWork优秀框架升级得到的. 2,解释:Struts2框架是一个轻量级的MVC流程框架,轻量级是指程序的代码不是很多,运行时占用的资源不是很多,MVC流程框架就是说它是支持分层开发,控制数据的流程,从哪里来,到那里去,怎么来,怎么去的这样一个框架: 二.环境搭建 1, 导入jar包 2导入web.xml文件,改配置 <?xml version

Struts2框架的执行流程

一.执行流程介绍 1.通过浏览器发送一个请求 2.会被StrutsPrepareAndExecuteFilter拦截(struts2的拦截器作用) 3.会调用strust2框架默认的拦截器(interceptor)完成部分功能 4.在执行Action中操作 5.根据Action中方法的执行结果来选择来跳转页面Result视图 一般我们将StrutsPrepareAndExecuteFilter 叫做前端控制器(核心控制器),只有在web.xml文件中配置了这个filter我们的strtus2框架

Struts2框架之-注解开发

Struts2主要解决了从JSP到Action上的流程管理,如何进行Uri和action类中每个方法的绑定这是重点,在这里先简单看一下配置文件中的简单配置: <span style="font-size:18px;">  <!-- 这是包名和命名空间的声明 --> <package name="orgPackage" namespace="/org" extends="struts-default"

Struts2框架具体解释

在Struts2的Model-View-Controller模式实现下面五个核心组件: 动作-Actions 拦截器-Interceptors 值栈/OGNL 结果/结果类型 视图技术 Struts 2和传统的MVC框架有些不同,在该框架中的作用的模式,而不是控制器的作用略有不同.尽管有一些重叠. 这是Struts的MVC模式的体系结构概述. 上图描写叙述了Struts2的高层体系结构模型.视图和控制器. 一个Struts2的调度Servlet过滤器和拦截器与控制器实现.该模型实现的动作和视图的