好久没有动博客了。今天看了一下慕课网的视频,简单了解一下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>
然后写一个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 }
然后是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>
<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>
比如上面的配置访问路径就为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 }
最后在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 }
然后是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 }
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 }
然后是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 }
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中处理结果类型
写的有点乱,简单记录一下