struts2入门

好久没有动博客了。今天看了一下慕课网的视频,简单了解一下struts2。

首先是在项目中引入struts2的文件,有一个比较简单的方法就是可以直接右键项目MyEclipse->Project facets->install struts2

然后是在web.xml中进行相应的配置(filter过滤器),这里和不使用框架基本类似,代码如下,系统好像会自动生成默认的过滤,如下

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
 3   <display-name>TryStruts2</display-name>
 4   <filter>
 5     <filter-name>struts2</filter-name>
 6     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
 7       <init-param>
 8           <param-name>struts.action.extension</param-name>
 9           <param-value>do</param-value>
10       </init-param>
11   </filter>
12   <filter-mapping>
13     <filter-name>struts2</filter-name>
14     <url-pattern>/*</url-pattern>
15   </filter-mapping>
16   <welcome-file-list>
17     <welcome-file>index.html</welcome-file>
18     <welcome-file>index.htm</welcome-file>
19     <welcome-file>index.jsp</welcome-file>
20   </welcome-file-list>
21   <!-- 
22   <filter>
23     <filter-name>struts2_1</filter-name>
24     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
25   </filter>
26   <filter-mapping>
27     <filter-name>struts2_1</filter-name>
28     <url-pattern>*.action</url-pattern>
29   </filter-mapping>
30    -->
31 </web-app>
web.xml

然后写一个action文件,如下

 1 package com.imooc.action;
 2 
 3 import javax.servlet.http.HttpServletRequest;
 4 import com.opensymphony.xwork2.ActionSupport;
 5 
 6 public class HelloWorldAction extends ActionSupport {
 7 
 8     private HttpServletRequest request;
 9     
10     //helloworld.action
11     
12     public String add(){
13 //        return SUCCESS;
14         return "add";
15     }
16     
17     public String update(){
18 //        return SUCCESS;
19         return "update";
20     }
21     @Override
22     public String execute() throws Exception {
23         System.out.println("执行Action");
24         return SUCCESS;
25     }
26 
27     
28 }
HelloWorldAction

然后是struts.xml文件,里面通过include引入了另外一个配置文件helloworld.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
 4     "http://struts.apache.org/dtds/struts-2.0.dtd">
 5  
 6 <struts>
 7     <include file="helloworld.xml"></include>
 8     
 9     <constant name="struts.action.extension" value="do"></constant>
10     
11     <!-- 感叹号方式 -->
12     <!-- http://localhost:8080/TryStruts2/helloworld!add.action -->
13     <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>
14 </struts>
struts.xml

<constant name="struts.action.extension" value="do"></constant>这行代码是进行访问后缀的设置,也可以在web.xml中设置,value用逗号分隔

有三种动态的方法调用action ,一种是指定method属性,一种是用感叹号方式,但是最推荐的是用通配符的方式,所以前两种方式在代码中注释了

<constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>   value设置为true就能开启感叹号访问方式

下面是helloworld.xml的代码,里面有注释就不进行详细分析了

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
 4     "http://struts.apache.org/dtds/struts-2.0.dtd">
 5 <struts>
 6     <!-- 映射 -->
 7     <!-- Action搜索顺序 1.判断当前包是否存在(存在2.1 不存在2.2) 2.1判断action是否存在,不存在则去默认namespase的package里面寻找action 
 8         2.2检查上一级路径的package是否存在,直到默认namespace -->
 9 
10     <package name="default" namespace="/" extends="struts-default">
11 
12         <!-- 默认action -->
13         <default-action-ref name="index"></default-action-ref>
14             <action name="index">
15                 <result>/error.jsp</result>
16             </action>
17 
18         
19 
20 
21         <action name="*_*_*" method="{2}" class="com.imooc.{3}.{1}Action">
22             <result>/result.jsp</result>
23             <result name="add">/{2}.jsp</result>
24             <result name="update">/{2}.jsp</result>
25         </action>
26 
27         <!-- 指定method属性 <action name="addAction" method="add" class="com.imooc.action.HelloWorldAction"> 
28             <result>/add.jsp</result> </action> <action name="updateAction" method="update" 
29             class="com.imooc.action.HelloWorldAction"> <result>/update.jsp</result> </action> -->
30     </package>
31 
32 </struts>
helloworld

比如上面的配置访问路径就为http://localhost:8080/TryStruts2/HelloWorld_add_action.do或者action或者html

下面介绍一下action接收参数的3个方式 ,这里推荐一篇博客,写的很详细规范。但是我还是自己写一遍毕竟强迫症。

http://www.cnblogs.com/bukudekong/archive/2012/03/29/2423064.html

表示感觉炒鸡神奇,再次暴露看的书少- -之前都是用的request

1.使用Action的属性接收参数

首先是login.jsp,主要是一个表单,注意input的name属性

<form action="LoginAction.action" method="post">
用户名:<input type="text" name="username" />
密码:<input type="password" name="password" />
<input type="submit" value="提交" />
</form>

然后是LoginAction

 1 package com.imooc.action;
 2 
 3 import com.opensymphony.xwork2.ActionSupport;
 4 
 5 public class LoginAction extends ActionSupport {
 6     
 7     //action 属性取值
 8     private String username;
 9     private String password;
10     
11     public String login(){
12         System.out.println(username);
13         
14         return SUCCESS;
15     }
16     
17     public String getUsername() {
18         return username;
19     }
20 
21     public void setUsername(String username) {
22         this.username = username;
23     }
24 
25     public String getPassword() {
26         return password;
27     }
28 
29     public void setPassword(String password) {
30         this.password = password;
31     }
32 }
LoginAction

 最后在helloworld.xml进行action配置

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

2.使用DomainModel接收参数

首先是login.jsp  input的name相应的更改了

<form action="LoginAction.action" method="post">
用户名:<input type="text" name="user.username" />
密码:<input type="password" name="user.password" />
<input type="submit" value="提交" />
</form>

然后是一个po实体类

 1 package com.imooc.po;
 2 
 3 public class User {
 4 
 5     private String username;
 6     private String password;
 7     public String getUsername() {
 8         return username;
 9     }
10     public void setUsername(String username) {
11         this.username = username;
12     }
13     public String getPassword() {
14         return password;
15     }
16     public void setPassword(String password) {
17         this.password = password;
18     }
19 }
User

然后是LoginAction

 1 package com.imooc.action;
 2 
 3 import com.imooc.po.User;
 4 import com.opensymphony.xwork2.ActionSupport;
 5 
 6 public class LoginAction extends ActionSupport {
 7     
 8     private User user;
 9     
10     public String login(){
11         System.out.println(user.getUsername());
12         
13         return SUCCESS;
14     }
15 
16     public User getUser() {
17         return user;
18     }
19 
20     public void setUser(User user) {
21         this.user = user;
22     }
23 }
LoginAction

3.使用ModelDriven接收参数,感觉这个好叼

首先是表单 input的name改了,使用前要加这个,类似jstl标签<%@ taglib prefix="s" uri="/struts-tags" %>

<form action="LoginAction.action" method="post">
用户名:<input type="text" name="username" /><s:fielderror name="username"></s:fielderror>
密码:<input type="password" name="password" />
书籍1:<input type="text" name="bookList[0].username" />
书籍2:<input type="text" name="bookList[1].username" />
年龄:<input type="text" name="age" />
<input type="submit" value="提交" />
</form>

然后是实体类

 1 package com.imooc.po;
 2 
 3 import java.util.List;
 4 
 5 public class User {
 6 
 7     private String username;
 8     private String password;
 9     private int age;
10     private List<User> bookList;
11     public String getUsername() {
12         return username;
13     }
14     public void setUsername(String username) {
15         this.username = username;
16     }
17     public String getPassword() {
18         return password;
19     }
20     public void setPassword(String password) {
21         this.password = password;
22     }
23     public List<User> getBookList() {
24         return bookList;
25     }
26     public void setBookList(List<User> bookList) {
27         this.bookList = bookList;
28     }
29     public int getAge() {
30         return age;
31     }
32     public void setAge(int age) {
33         this.age = age;
34     }
35     
36 }
User

然后是LoginAction

 1 package com.imooc.action;
 2 
 3 import com.imooc.po.User;
 4 import com.opensymphony.xwork2.ActionSupport;
 5 import com.opensymphony.xwork2.ModelDriven;
 6 
 7 public class LoginAction extends ActionSupport implements ModelDriven<User>{
 8     
 9     private User user=new User();
10     
11     public String login(){
12         
13         System.out.println(user.getUsername());
14         System.out.println(user.getBookList().get(0).getUsername());
15         System.out.println(user.getBookList().get(1).getUsername());
16         
17         return SUCCESS;
18     }
19 
20     @Override
21     public User getModel() {
22         return user;
23     }
24     
25     @Override 
26     public void validate(){
27         if(user.getUsername()==null||"".equals(user.getUsername())){
28             this.addFieldError("username", "用户名不能为空");
29         }
30     }
31 }
LoginAction

validate()方法用于验证用户名是否为空

在helloworld.xml中添加 用户处理表单验证不正确时返回登陆页

<action name="LoginAction" method="login" class="com.imooc.action.LoginAction">
<result>/success.jsp</result>
<!-- 表单验证不正确 -->
<result name="input">/login.jsp</result>
</action>

下面是5中处理结果类型

写的有点乱,简单记录一下

原文地址:https://www.cnblogs.com/wangkaipeng/p/5399384.html