Java-Struts学习笔记之使用Struts框架创建Web项目

1.建立一个名为struts2的web project

2.需要引入的包:

commons-fileupload-1.2.2.jar
commons-io-2.0.1.jar
commons-logging-1.1.1.jar
ognl-3.0.1.jar
struts2-core-2.2.3.jar
xwork-core-2.2.3.jar
-----------------struts2.0要求导入的包除此以外还要添加以下的包
freemarker-2.3.16.jar
javassist-3.11.0.GA.jar
commons-lang-2.5.jar

将这些包直接复制到WebRoot/WEB-INF/lib目录下即可,Myeclipse会自动将这些包添加到class path里。

3.新建一个login.jsp
1)修改web.xml, 配置filter(org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter),即配置struts过滤器。

配置如下:

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> 

2)添加struts本身的配置文件,在src下建下个struts.xml的文件; struts真正读取的文件是WEB-INF/classes/目录下的struts.xml文件,而当修改了src目录下的struts.xml文件后,MyEclipse会自动src目录下的struts.xml文件拷贝一份到WEB-INF/classes目录下。

3)添加struts.xml的dtd验证,打开struts-2.2.3-all.zip\struts-2.2.3\apps目录下的 struts2-blank.war\WEB-INF\src\java目录下的struts.xml文件,拷贝dtd那一部分到src/struts.xml文件中。

配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <package name="struts2" extends="struts-default">
        <action name="login" class="com.struts2.LoginAction">
            <result name="success">/result.jsp</result>
        </action>
    </package>
</struts>

4)在src目录下建一个包:com.struts2,并在包中建一个类:LoginAction.java,并编辑,如下:

package com.struts2;
public class LoginAction {
    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;
    }
    public String execute()
    {
        return "success";
    }
}

5)再修改login.jsp ,如下:

<body>
<form action="login" class="com.struts2.LoginAction">
    username:<input type="text" name="username"><br>
    password:<input type="password" name="password"><br>
    <input type="submit" value="submit">
</form>
</body>

然后再在webRoot目录一添加一个result.jsp页面,编辑如下:

<body>
username: ${requestScope.username }<br>
username: ${username }<br>
username: ${param.username }<br>
<!-- 注意这一种取值方式与上面两种之间的差别,上面两种的取值方式相同 -->
password: ${requestScope.password }<br>
</body> 

4.向tomcat中添加此应用
将struts2项目添加到tomcat应用中,修改Tomcat 6.0\conf目录下的server.xml文件

<server>
    ............
    <Context path="/struts2" docBase="F:\workspace6.5\struts2\WebRoot" reloadable="true"/>
    </Host>
    </Engine>
    </Service>
</Server> 

关联jar包的源文件 给某一个jar包关联源代码,在工程上点右键 -> builder path -> libaries -> 点开那个指定的包,选择 Source attachment ,然后再选择Edit,择中源文件所在的文件夹即可。

根据源文件生成chm帮助文档

根据源代码,生在struts的帮助文档
1.新建一个struts_doc的java project,然后将需要生在doc文件的源文件复制到src目录下,并引入相对应的依赖包到build path中。

2.在MyEclipse中选择project -> generate javadoc -> 选中struts_doc工程,并指定目标文件夹 -> 下一步,并给document取一个title -> next -> finish 。 

3.然后将jd2chm.exe拷贝到刚生成的帮助文档文件夹当中即可。  

Struts2中类型转换
1.Struts2 的类型转换,对于 8 个原生数据类型以及 Date,String 等常见类型,Struts2可以使用内建的类型转换器实现自动的转换;但对于自定义的对象类型来说,就需要我们自己指定类型转换的方式了。

  1. 对于自定义的类型转换器来说需要提供 3个信息:Action的名字、Action 中待转换的属性名以及该属性对应的类型转换器。其中Action的名字是通过属性文件名来获得的、 Action中待转换的属性名是通过属性文件中的 key来获得的,该属性对应的类型转换器是通过该key所对应的 value来获得的。

例: 在项目中新建一个test.jsp,编辑:

<body>
<h1>使用分号隔开用户名与密码信息</h1>
<form action="userAction.action">
    user info:<input type="text" name="user"><br>
    <input type="submit" value="submit">
</form>
</body>

再在src目录下新建一个com.bean包,并在包中新建一个名为User的类如下:user.java

package com.bean;
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;
    }
}

新建一个userAction类,并继承ActionSupport,并在struts.xml中添加

<action name="userAction" class="com.struts2.UserAction">
    <result name="success">/output.jsp</result>
</action>

编辑userAction.java:

package com.struts2;
        import com.bean.User;
        import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport
{
    private User user;
    public User getUser()
    {
        return user;
    }
    public void setUser(User user)
    {
        this.user=user;
    }
    @Override
    public String execute() throws Exception {
        System.out.println("username:"+user.getUsername());
        System.out.println("password:"+user.getPassword());
        return SUCCESS;    //SUCCESS是ActionSupport中的一个常量
    }
}

新建一个com.converter的包,并在包在添加一个类UserConverter,编辑如下:UserConverter.java

package com.converter;
        import java.util.Map;
        import java.util.StringTokenizer;
        import com.bean.User;
        import ognl.DefaultTypeConverter;
public class UserConverter extends DefaultTypeConverter
{
    @Override
    public Object convertValue(Map context, Object value, Class toType)
    {
        if(User.class==toType)    //从页面向后台对象转换
        {
            String[] str=(String[])value;
            String firstValue=str[0];
            StringTokenizer st=new StringTokenizer(firstValue,";");
            String username=st.nextToken();
            String password=st.nextToken();
            User user=new User();
            user.setUsername(username);
            user.setPassword(password);
            return user;
        }
        else if(String.class==toType)    //从后台对象向页面转换
        {
            User user=(User)value;
            String username=user.getUsername();
            String password=user.getPassword();
            String userInfo="username:"+username+", password:"+password;
            return userInfo;
        }
        return null;
    }
}

然后在com.struts2包中建立一个UserAction-conversion.properties文件,并编辑: user=com.converter.UserConverter
重新启动tomcat,测试。

Output.jsp

<body>
<s:property value="user"/><!-- 获得UserAction当中的user属性 -->
</body>
  1. 可以使用 Struts2 框架自带的类型转换器 StrutsTypeConverter 简化类 型 转 换 代 码 的 编 写 , StrutsTypeConverter 继 承 于DefaultTypeConverter 父 类 , 并 且 提 供 了 两 个 抽 象 方 法 :convertFromString与convertToString,分别表示从页面的字符串转换为后台对象以及从后台对象转换为页面的字符串,我们只需实现这两个抽象方法即可实现类型转换。

例:在com.converter包下再新建一个UserConverter2类,并继承StrutsTypeConverter,编辑:

package com.converter;
import java.util.Map;
import java.util.StringTokenizer;
import org.apache.struts2.util.StrutsTypeConverter;
import com.bean.User;
public class UserConverter2 extends StrutsTypeConverter {
    @Override
    public Object convertFromString(Map context, String[] values, Class toClass) {
        User user=new User();
        String value=values[0];
        StringTokenizer st=new StringTokenizer(value,";");
        user.setUsername(st.nextToken());
        return user;
    }
    @Override
    public String convertToString(Map context, Object o) {
        User user=(User)o;
        String username=user.getUsername();
        String password=user.getPassword();
        String userInfo="username:"+username+",password:"+password;
        return userInfo;
    }
}

并修改UserAction-Converter.properties,如下:

#user=com.converter.UserConverter
user=com.converter.UserConverter2

重启tomcat,测试。

批量的类型转换

Usertest.jsp

<body>
<h1>使用分号隔开用户名与密码信息</h1>
<form action="usersAction.action">
    user info1:<input type="text" name="users"><br>
    user info2:<input type="text" name="users"><br>
    user info3:<input type="text" name="users"><br>
    user info4:<input type="text" name="users"><br>
    <input type="submit" value="submit">
</form>
</body>

usersAction.java

package com.struts2;
import java.util.ArrayList;
import java.util.List;
import com.bean.User;
import com.opensymphony.xwork2.ActionSupport;
public class UsersAction extends ActionSupport
{
    private List<User> users;
    public List<User> getUsers() {
        return users;
    }
    public void setUsers(List<User> users) {
        this.users = users;
    }
    @Override
    public String execute() throws Exception {
        for(User u:users)
        {
            System.out.println(u.getUsername()+", "+u.getPassword());
        }
        return SUCCESS;
    }
}

UsersConverter.java

package com.converter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import org.apache.struts2.util.StrutsTypeConverter;
import com.bean.User;
public class UsersConverter extends StrutsTypeConverter
{
    @Override
    public Object convertFromString(Map context, String[] values, Class toClass) {
        List<User> list=new ArrayList<User>();
        for(String value:values)
        {
            StringTokenizer st=new StringTokenizer(value,";");
            User user=new User();
            user.setUsername(st.nextToken());
            user.setPassword(st.nextToken());
            list.add(user);
        }
        return list;
    }
    @Override
    public String convertToString(Map context, Object o) {
        List<User> list=(List<User>)o;
        StringBuffer buffer=new StringBuffer();
        for(User user : list)
        {
            String username=user.getUsername();
            String password=user.getPassword();
            buffer.append("username:").append(username)
                    .append(" password:").append(password).append(" ");
        }
        return buffer.toString();
    }
}

UsersAction-Converter.properties

users=com.converter.UsersConverter

output.jsp

<body>
<s:property value="user"/><!-- 获得UserAction当中的user属性 -->
<s:property value="users"/><!-- 获得UsersAction当中的users属性 -->
</body>

重启tomcat。

全局类型转换
全局类型转换。在src目录下新建xwork-conversion.properties,该文件的内容是待转换的类=转换器的名字,即 com.shengsiyuan.bean.User=com.shengsiyuan.converter.UserConverter2 。

这样设置之后,对所有的action中的User对象自动调用UserConverter2全局对象。

版权所有,转载请注明出处 luowei.github.io.