Struts2学习笔记之类型转换 一

Struts2之类型转换一

类型转换让值的传递变的更加方便灵活,下面以一个学习的例子来说明

请求端jsp代码
user.jsp

<html>
<head>
<title>Insert title here</title>
</head>
<body>
    <form action="userAction">
        username: <input type="text" name="user"><br>
        <input type="submit" value="submit">
    </form>
</body>
</html>

注意:
1、当action的值没有带任何扩展名时,默认会加上.action作为扩展名,所以这里写成userAction.action也是可以的。
2、这里定义的name属性值一定要跟服务端的action里面的set方法保持关联,也就是说在action中必须有一个setUser的方法才能够正常取得到文本框中的内容(由底层反射实现所决定)。

响应jsp
output.jsp

<html>
<head>
<title>Insert title here</title>
</head>
<body>
    <%
        User user = (User) request.getAttribute("user");

        if (user != null) {
    %>
    username: <%=user.getUsername()%><br>
    password: <%=user.getPassword()%>
    <%
        } else {

            System.out.println(user);
        }
    %>
</body>
</html>

服务端action
UserAction .java

public class UserAction extends ActionSupport {

    private User user;
    private static final long serialVersionUID = 1L;
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }

注意:
定义私有属性的时候确保属性名与请求端的parameter名保持一致,这样自动生成的get、set方法在被struts利用反射解析的时候很容易就找到。

请求信息对应的bean
User.java

public class User {

    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;
    }
}

类型转换
UserConverter.java

public class UserConverter extends DefaultTypeConverter {

    @Override
    public Object convertValue(Map context, Object value, Class toType) {
        if (User.class == toType) {//从页面向后台对象转换

            String[] str = (String[]) value;
            String firstStr = str[0];
            StringTokenizer st = new StringTokenizer(firstStr, ";");//分割字符串
            String username = st.nextToken();//取得用户名
            String password = st.nextToken();//取得密码

            User user = new User();
            user.setUsername(username);
            user.setPassword(password);

            return user;
        }
        return null;
    }
}

注意:
自定义的类型转换类都要继承于DefaultTypeConverter 类,该类属于ognl.jar包,通过重写的形式来实现自定义的类型转换方法。

至此,服务端的控制层和模型层基本完成,但是,需要一个配置文件来连接action和converter,这个配置文件的编写有两种:
1、①配置文件名:UserAction-conversion.properties(定必须这么写);②配置文件路径:与UserAction.java同包。③配置文件内容:user=com.struts.converter.UserConverter
2、配置文件名:xwork-conversion.properties(固定必须这么写);②配置文件路径:即classpath同路径(src下面);③配置文件内容:com.struts.bean.User=com.struts.converter.UserConverter
它们的区别在于,如果时跟action同包,那么,每个action都必须有自己的-conversion.properites配置文件,而第二种情况下,则可以将所有的action配置在同一个配置文件中。

接下来是struts和webapp的配置
web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app   
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"   
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
    <filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

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>
    <package name="struts" extends="struts-default">
        <action name="userAction" class="com.xf.struts.UserAction">
            <result name="success">/output.jsp</result>
        </action>
    </package>
</struts>

注意:
1、package属性name可以自定义,只要有意义就行
2、action属性name与请求jsp中的action保持一致,class值对应的就是action的java类路径。
3、result属性name对应action中的excute方法返回的值,标签的内容则是要响应的jsp。

将项目部署到tomcat中进行测试。
页面中输入:
这里写图片描述

点击submit,显示下面的结果。
这里写图片描述

届时,一个简单的struts类型转换实例全部完成。下面来分析下项目运转起来的流程:
首先,启动服务器,在请求页面输入相关信息,点击提交按钮。接着,由web.xml接管请求,发现配置了相关的strtus-filter(过滤器),将请求转到struts.xml。在sturts中,请求被链接到了后台的action对象中进行处理,而与此同时,-conversion.properties配置文件获取到了消息,对传递到action中的user对象进行类型转换处理,处理完毕后返回object给action,action执行execute方法,将响应操作提交给struts,根据sturts.xml配置的响应页面进行跳转,得到最终的结果。

最后,以张龙老师的名言结尾: no reflection, no most frameworks.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值