struts2

struts2是基于mvc设计模式的web框架

工作原理:


Paste_Image.png

一.使用maven+struts2工具创建第一个helloworld

  • 首先新建maven项目后的目录结构(项目名为:struts2-test1)


    struts2-1.jpg
  • 配置pom.xml对于struts2的依赖,只需要解决struts2-core一个依赖即可

    <!-- Struts2 依赖 -->  
    <dependency>  
        <groupId>org.apache.struts</groupId>  
        <artifactId>struts2-core</artifactId>  
        <version>2.3.1</version>  
    </dependency>  

pom.xml整体内容如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>struts2</groupId>
  <artifactId>struts2-test1</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>struts2-test1 Maven Webapp</name>
  <url>http://maven.apache.org</url>
  
     <!-- 开发环境部署所用 -->
  <properties>
      <warPackageName>struts2-test1</warPackageName>
      <tomcat.deploy.server>localTestServer</tomcat.deploy.server>
      <tomcat.deploy.serverUrl>http://localhost:8081/manager/text</tomcat.deploy.serverUrl>
  </properties>
  
  
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    
    <!-- Struts2 依赖 -->  
    <dependency>  
        <groupId>org.apache.struts</groupId>  
        <artifactId>struts2-core</artifactId>  
        <version>2.3.1</version>  
    </dependency>  
    
    
  </dependencies>
  <build>
    <finalName>struts2-test1</finalName>
    <plugins>  
        <plugin>  
                   <!-- 编译时指定jdk1.7进行编译 -->
                    <artifactId>maven-compiler-plugin</artifactId>  
                    <version>3.5.1</version>  
                    <configuration>  
                        <source>1.7</source>  
                        <target>1.7</target>  
                    </configuration>  
           </plugin>  
           <!-- 部署相关 -->
           <plugin>
             <groupId>org.apache.tomcat.maven</groupId>
             <artifactId>tomcat7-maven-plugin</artifactId>
             <version>2.2</version>
              <configuration>  
                  <url>${tomcat.deploy.serverUrl}</url>  
                  <server>${tomcat.deploy.server}</server>  
                  <path>/${warPackageName}</path>
              </configuration>  
       </plugin>  
       </plugins>
  </build>
</project>

配置完成后会看到如下依赖已经加载:(下面三个标红色的包必须加载)

struts2-2.jpg
  • 配置web.xml 过滤器
<!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>
    <display-name>Archetype Created Web Application</display-name>
   <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>
    
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
     </welcome-file-list>
  
</web-app>
  • 新建HelloWorldAction
package com.lxf.action;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction  extends ActionSupport{

    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        System.out.println("执行HelloWorld action!");
        return SUCCESS;
    }
    
}
  • 新建UserAction
package com.lxf.action;

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {
    private static final long serialVersionUID = -1417237614181805435L;  
    private String name;
    private String password;
    /**
     * 跳转到登录界面
     * @return
     */
    public String login_input() {
        return SUCCESS;
    }
    
    /**
     * 登录
     * @return
     */
    public String login() {
        System.out.println("name->" + name);
        System.out.println("password->" + password);
        
        return SUCCESS;
    }
}
  • 配置struts2.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="default" namespace="/" extends="struts-default">

        <action name="helloworld" class="com.lxf.action.HelloWorldAction">
            <result>/result.jsp</result>
        </action>
          
        <action name="login" class="com.lxf.action.UserAction" method="login">  
            <result name="success">  
                /index.jsp  
            </result>  
        </action>  
    </package>
</struts>   
  • 创建index.jsp页面
<html>
<body>
<h2>Hello World!</h2>
</body>
</html>
  • result.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h2>This is result.jsp</h2>
</body>
</html>
  • 在项目右击点击Run AS->ON Server选择tomcat7,启动web容器.(或者在pos.xml中Run AS->Maven build 使用 tomcat7:deploy部署到远程web服务器)
  • 在浏览器中输入:
http://localhost:8081/struts2-test1/helloworld.action
http://localhost:8081/struts2-test1/login.action

二.功能介绍

  • 搜索action顺序


    Paste_Image.png
  • 动态方法调用(一个action中有多个方法在xml的配置)
    第一种方法,在struts.xml中每个action标签配置一个method(会导致多个action,不推荐使用)

        <action name="helloworld" class="com.lxf.action.HelloWorldAction">
            <result>/result.jsp</result>
        </action>
        
         <action name="add" class="com.lxf.action.HelloWorldAction" method="add">
            <result>/result.jsp</result>
        </action>

第二种方法,感叹号方式(不推荐使用)
(1) 在struts.xml中配置常量

<struts>   
    <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
</struts>   

(2) action中添加update方法

    /**
     *  我是修改方法
     */
    public String update()
    {
        System.out.println("我是修改方法");
        return "update";
    }

(3)配置struts.xml的action标签

        <!-- 使用感叹号方式配置多个method -->
        <action name="helloworld2" class="com.lxf.action.HelloWorldAction">
            <result>/result.jsp</result>
            <result name="update">/index.jsp</result>
        </action>

(4)访问方式:http://localhost:8081/struts2-test1/myRoute/helloworld2!update.action

第三种通配符方式(推荐使用
(1) 配置struts.xml中的action

        <!-- 通配符方式配置多个method -->
       <action name="helloworld_*" method="{1}" class="com.lxf.action.HelloWorldAction" >
            <result>/result.jsp</result>
            <result name="add">/index.jsp</result>
            <result name="update">/result.jsp</result>
        </action>

(2) 访问:

http://localhost:8081/struts2-test1/myRoute/helloworld_add.action (访问action中的add方法)
http://localhost:8081/struts2-test1/myRoute/helloworld_update.action(访问action中的update方法)
  • structs.xml中包含多个模块的配置文件(注意:被包含文件的packag的name值不能一样)
<struts>
    <!-- 使用include标签引入各个模块xml配置文件 -->
    <include file="helloworld.xml"></include>
    <include file="helloworld2.xml"></include>
    <constant name="struts.i18n.encoding" value="UTF-8"></constant>
    <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
</struts>   

helloworld.xml内容

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

        <action name="helloworld" class="com.lxf.action.HelloWorldAction">
            <result>/result.jsp</result>
        </action>
        
         <action name="add" class="com.lxf.action.HelloWorldAction" method="add">
            <result>/result.jsp</result>
        </action>
        
        <!-- 使用感叹号方式配置多个method -->
        <action name="helloworld2" class="com.lxf.action.HelloWorldAction">
            <result>/result.jsp</result>
            <result name="update">/index.jsp</result>
        </action>
...
</struts>   

helloworld2.xml内容

<struts>
    <package name="default1" namespace="/myHello" extends="struts-default">
        <action name="helloworld3" class="com.lxf.action.HelloWorldAction">
            <result>/result.jsp</result>
        </action>
    </package>
</struts>   
  • 默认action
        <!-- 默认action -->
        <default-action-ref name="index"></default-action-ref>     
        <action name="index">
            <result>/index.jsp</result>
        </action>
  • struts2后缀名配置

(1)第一种方式配置struts.xml中的常量

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

访问以下路径完成的功能都是相同的

http://localhost:8081/struts2-test1/myHello/helloworld3.html
http://localhost:8081/struts2-test1/myHello/helloworld3.do
http://localhost:8081/struts2-test1/myHello/helloworld3.action

(2)第二种方式,还可以在struts.properties中配置

struts.action.extension=html,action,do

(3)第三种方式,web.xml在过滤器中配置

   <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
        <init-param>
            <param-name>struts.action.extension</param-name>
            <param-value>action</param-value>
         </init-param>
   </filter>
  • action中接收参数
  • 第一种:使用Action属性接收
    login.jsp内容
<form action="/struts2-test1/myRoute/login.action" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"> <br>
<input type="submit" name="submit" value="提交" /><br>
</form>

LoginAction内容定义属性和对应的set和get方法就可以接收

public class LoginAction  extends ActionSupport {
    private String username;
    private String password;
    public String login()
    {
        System.out.println(username+password);
        return SUCCESS;
    }
    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;
    }  
}

第二种:使用DomainModel接收(建立一个User类专门用来接收参数)
User.java内容如下:

package com.lxf.po;
/**
 * 用来在action中接收用户表单提交过来的数据
 * @author lxf
 *
 */

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

login.xml内容如下:

<form action="/struts2-test1/myRoute/login.action" method="post">
用户名:<input type="text" name="user.username"><br>
密码:<input type="password" name="user.password"> <br>
<input type="submit" name="submit" value="提交" /><br>
</form>

LoginAction内容如下:(注意:需要为user对象添加get和set方法,并且user不需要实例化, html表单中需要指定user)

public class LoginAction  extends ActionSupport {
    private User user;
    public String login()
    {
        System.out.println(user.getUsername());
        return SUCCESS;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
}

第三种:使用ModelDiven接收:(注意:不需要为User对象设置set和get方法,并且user需要实例化,html表单中不需要指定user)推荐使用
在LoginAction中实现ModelDriven接口
User内容:

public class User {
    private String username;
    private String password;
    //接收form表单中的图书字符串数组
    private List<String> bookList;
     //接收form表单中的用户对象数组
    private List<User>userList;
    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 List<String> getBookList() {
        return bookList;
    }
    public void setBookList(List<String> bookList) {
        this.bookList = bookList;
    }
    public List<User> getUserList() {
        return userList;
    }
    public void setUserList(List<User> userList) {
        this.userList = userList;
    }
    
}

LoginAction内容:

public class LoginAction  extends ActionSupport 
implements ModelDriven<User>{
    private User user = new User();
    public String login()
    {
        System.out.println(user.getUsername());
        System.out.println(user.getBookList().get(0));
        System.out.println(user.getBookList().get(1));
        System.out.println(user.getUserList().get(0).getUsername());
        System.out.println(user.getUserList().get(1).getUsername());
        return SUCCESS;
    }
    /**
     * 实现ModelDriven接口的方法
     * @return
     */
    @Override
    public User getModel() {
        // TODO Auto-generated method stub
        return user;
    }

login.jsp内容

<form action="/struts2-test1/myRoute/login.action" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"> <br>
图书1:<input type="text" name="bookList[0]"> <br>
图书2:<input type="text" name="bookList[1]"> <br>
用户1:<input type="text" name="userList[0].username"> <br>
用户2:<input type="text" name="userList[1].username"> <br>
<input type="submit" name="submit" value="提交" /><br>
</form>
  • 处理结果返回,如果result中的name标签不写,默认为success
        <action name="helloworld2" class="com.lxf.action.HelloWorldAction">
            <result>/result.jsp</result>
            <result name="update">/index.jsp</result>
        </action>

处理结果的类型如下:


Paste_Image.png
  • 以下对于返回结果为input的介绍
    (1)如果在User.php中属性为
    //年龄
    private int age;

在struts.xml对应的action中配置

        <action name="login" class="com.lxf.action.LoginAction" method="login">  
            <result name="input">/index.jsp</result>
            <result > /success.jsp</result>  
        </action> 

那么在页面的input中就必须输入整数,否则会有异常:
(2)在action中重写父类的validate,做表单验证用

    @Override
    public void validate() {
        if(user.getUsername()==null || "".equals(user.getUsername()))
        {
            this.addFieldError("username", "用户名不能为空!");
        }
  • 公共strut2配置配置公共result
    <package name="">
        <global-results>
            <result name="404">t=/404.jsp</result>
        </global-results>
    </package>

* struts2.xml中的result有param子标签

        <action name="login" class="com.lxf.action.LoginAction" method="login">  
            <result >
                <param name="location">/$(#request.path).jsp</param>
                <param name="parse">true</param>默认为true,代表可以使用OGNL表达式获取session与域的信息
            </result>  
        </action>  
  • 打开开发模式,在struts.xml中配置常量
    <!-- 打开开发模式 -->
    <constant name="struts.devMode" value="true"></constant>
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容