Struts(二)

Struts2核心业务

1、请求数据自动封装

2、类型转换

3、Struts中数据处理

4、文件上传

1、Action开发与访问

1.1、Struts2 Action的开发

方式一:继承ActionSupport

如果使用Struts的数据校验功能必须实现此类

方式二:实现Action接口

方式三:写一个普通类,不实现接口和继承类

1.2、struts通配符

Action类

public class Action extends ActionSupport{
    private User user;
    public void setUser(User user) {
        this.user = user;
    }
    public User getUser() {
        return user;
    }

    public String login(){  
        System.out.println(user.getName());
        System.out.println(user.getAge());
        System.out.println(user.getPwd());
        return "login";
    }

    public String name(){
        System.out.println(user.getName());
        return "name";
    }

    public String age(){
        System.out.println(user.getAge());
        return "age";
    }

通配符配置struts.xml

        <!-- 通配符的使用 -->
        <action name="user_*" class="com.wsk.b_action.Action" method="{1}">
            <result name="{1}">/index.jsp</result>
        </action>

1.3、名称空间

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

这里的namespace指定访问的路径,服务器搜索原理:

http://localhost:8080/struts/user/a/b/login.action
step1:  访问localhost 服务器ip
step2:  访问服务器端口 8080
step3:  访问项目        项目名
step4:  访问指定的名称空间   /user/a/b   先看这个名称空间是否存在指定的资源login.action,有就访问到,没有继续向下
step5:  /user/a     在此名称空间下寻找资源
step6:  /user       
step7:  /       如果还没找到就报错

1.4、动态方法调用

调用ActionName!方法名
注意要使用动态方法调用时,要使用常量开启动态方法调用
安全性能差,不建议使用

struts.enable.DynamicMethodInvocation = true
       <!-- 动态方法调用:http://localhost:8088/struts2_day526/user!login -->
        <action name="user" class="com.wsk.b_action.Action" >
            <result name="success">/login.jsp</result>
            <result name="login">/login.jsp</result>
            <result name="name">/login.jsp</result>
            <result name="age">/login.jsp</result>
        </action>

1.5、全局跳转视图配置

首先会在action中找相应的返回值,如果没有,就在全局跳转中找
注意:这个全局跳转必须配置在package中第一个标签

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

2、Struts2常量

2.1、Struts中访问后缀:

Struts1中默认访问后缀是*.do Struts2中默认访问后缀是*.action
struts2中默认访问后缀配置文件在struts-core包中,org.apache.struts2下default.properties中配置

struts.action.extension=action,,

修改访问后缀,在struts.xml中通过常量配置修改

<!-- 代表了访问后缀为.action 或者 没有后缀 
    action   表示访问后缀为.action
    action,do    表示访问后缀为.action/.do
    action,do,   表示访问后缀为.action/.do/没有后缀--!>
<constant name="struts.action.extension" value="action,,"></constant>

2.2、其他的一些常量全局配置

constant.xml

<?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>

    <!-- 一、全局配置 -->
    <!-- 0. 请求数据编码 -->
     <constant name="struts.i18n.encoding" value="UTF-8"/>
    <!-- 1. 修改Struts默认的访问后缀 -->
    <constant name="struts.action.extension" value="action,do,"></constant>
    <!-- 2. 修改xml自动重新加载 -->
    <constant name="struts.configuration.xml.reload" value="true"/>
    <!-- 3. 开启动态方法调用 (默认不开启)-->
    <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
    <!-- 4. 修改上传文件的最大大小为30M -->
    <constant name="struts.multipart.maxSize" value="31457280"/>

</struts>

struts.xml

<?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>

    <!-- 二、总配置文件:引入其他所有配置文件 -->
    <!-- 如果存在同名的action后边覆盖前边 --!>
    <include file="constant.xml"></include>
    <include file="cn/itcast/a_config/struts.xml"></include>
    <include file="cn/itcast/b_config2/config.xml"></include>
    <include file="cn/itcast/c_data/data.xml"></include>
    <include file="cn/itcast/d_type/type.xml"></include>
    <include file="cn/itcast/e_fileupload/upload.xml"></include>

</struts>

3、数据处理

3.1域中存储数据

        // 方式一
        HttpServletRequest req = ServletActionContext.getRequest();
        HttpSession sess = req.getSession();
        ServletContext servletContext = ServletActionContext.getServletContext();
        // 方式二
        ActionContext ac = ActionContext.getContext();
        //拿到request的Map
        Map<String, Object> request = ac.getContextMap();
        // 拿到session对象的Map
        Map<String, Object> session = ac.getSession();
        // 拿到servletContext对象的Map
        Map<String, Object> application = ac.getApplication();

实现方式三:实现接口
action类

public class DataAction extends ActionSupport implements RequestAware, SessionAware, ApplicationAware{

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

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

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

    @Override
    public String execute() throws Exception {
        request.put("request_data", "request_dataAction_requestAware");
        session.put("session_data", "session_dataAction_requestAware");
        application.put("application_data", "application_dataAction_requestAware");

        return this.SUCCESS;
    }
}

显示结果页面

 <body>
    <!-- EL表达式 -->
    <!-- 直接从对应的域取数据 -->
    ${requestScope.request_data }<br/>
    ${sessionScope.session_data }<br/>
    ${applicationScope.application_data }<br/>
    <!-- 依次从pageContext、request、session、application域中查找、 -->
    ${request_data }<br/>
    ${session_data }<br/>
    ${application_data }<br/>
  </body>

3.2请求数据自动封装

一般普通类型和日期类型,param拦截器会实现请求数据的自动封装,注意要实现set方法,如果是对象类型则还需要提供get方法,提交的数据name属性为:对象名.属性名提交的日期类型默认格式为yyyy-MM-dd

自定义日期类型的格式

step1:自己写一个转换器 (需要继承StrutsTypeConverter)
step2:配置转换器

转换器类(放置位置随意)

|--TypeConverter    类型转换器接口
|------DefaultTypeConverter 实现接口的类
|------------SrutsTypeConverter    继承自上个类,用户编写转换器需要继承此类

转换器类

/**
 * 自定义类型转换器类
 * @author wsk
 *
 */
public class MyConverter extends StrutsTypeConverter{

    /**
     * 把String转换成指定类型
     * @param context   当前上下文环境
     * @param values    jsp表单提交的字符串的值
     * @param toClass   要转换为的目标类型
     */

    @Override
    public Object convertFromString(Map context, String[] values, Class toClass) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        try {
            return sdf.parse(values[0]);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return null;
    }

    @Override
    public String convertToString(Map context, Object o) {
        // TODO Auto-generated method stub
        return null;
    }

}

配置

局部转换器配置

在要提交的Action包下新建一个配置文件(告诉Struts什么类型应该使用我们自己定义的转换器)
命名规则:ActionName-conversion.properties
内容:date=com.wsk.c_date.MyConverter

DateAction-conversion.properties

date=com.wsk.c_date.MyConverter

全局类型转换器配置

配置文件:在src下新建xwork-conversion.properties
内容:类型=转换器类
例如 :java.util.Date=com.wsk.c_date.MyConverter

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值