Struts2
来源:互联网 发布:苹果打击垫软件 编辑:程序博客网 时间:2024/06/05 14:17
访问Servlet API:
Servlet API:
- HttpServletRequest
- HttpServletResponse
- ServletContext
Struts2不提供Servlet API,所以提供三种方式访问Servlet API:
Action搜索顺序:
动态方法调用:
1、指定method属性(复杂):
在HelloWorldAction添加方法add、update:
package com.action;import com.opensymphony.xwork2.ActionSupport;public class HelloWorldAction extends ActionSupport { public String add(){ return SUCCESS; } public String update(){ return SUCCESS; } @Override public String execute() throws Exception { //默认方法 System.out.println("执行Action"); return SUCCESS; //返回数据显示的视图的路径 }}
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="default" namespace="/" extends="struts-default"> <action name="helloworld" class="com.action.HelloWorldAction"> <result>/result.jsp</result> </action> <action name="addAction" method="add" class="com.action.HelloWorldAction"> <result>/add.jsp</result> </action> <action name="updateAction" method="update" class="com.action.HelloWorldAction"> <result>/update.jsp</result> </action> </package></struts>
创建add.jsp、update.jsp:
输入网页:http://localhost:8080/HelloWorld/addAction.action或http://localhost:8080/HelloWorld/updateAction.action即可。
2、感叹号方式(不推荐):
修改add、update方法:
public String add(){ return "add"; } public String update(){ return "update"; }
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="default" namespace="/" extends="struts-default"> <action name="helloworld" class="com.action.HelloWorldAction"> <result>/result.jsp</result> <result name="add">/add.jsp</result> <result name="update">/update.jsp</result> </action> </package> <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant></struts>
运行http://localhost:8080/HelloWorld/helloworld!add.action或http://localhost:8080/HelloWorld/helloworld!update.action
3、通配符方式(推荐):
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="default" namespace="/" extends="struts-default"> <action name="helloworld_*" method="{1}" class="com.action.HelloWorldAction"> <result>/result.jsp</result> <result name="add">/{1}.jsp</result> <result name="update">/{1}.jsp</result> </action> </package> <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant></struts>
运行http://localhost:8080/HelloWorld/helloworld_add.action或http://localhost:8080/HelloWorld/helloworld_update.action。
引申:
<?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="default" namespace="/" extends="struts-default"> <action name="*_*" method="{2}" class="com.action.{1}Action"> <result>/result.jsp</result> <result name="add">/{2}.jsp</result> <result name="update">/{2}.jsp</result> </action> </package> <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant></struts>
运行http://localhost:8080/HelloWorld/HelloWorld_add.action或http://localhost:8080/HelloWorld/HelloWorld_update.action或http://localhost:8080/HelloWorld/HelloWorld_.action。
指定多个配置文件:
若action过多,将其全部添加到一个struts.xml中,文件会非常大,可通过配置多个文件来解决。在struts.xml添加多个配置文件:
指定编码:
eg:
新建helloworld.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="default" namespace="/" extends="struts-default"> <action name="*_*_*" method="{2}" class="com.{3}.{1}Action"> <result>/result.jsp</result> <result name="add">/{2}.jsp</result> <result name="update">/{2}.jsp</result> </action></package></struts>
将其添加到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> <include file="helloworld.xml"></include> <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant></struts>
运行http://localhost:8080/HelloWorld/HelloWorld_add_action.action或http://localhost:8080/HelloWorld/HelloWorld_update_action.action。
默认Action:找不到action时,调用默认action来解决。
在helloworld.xml中增加默认action:
<?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="default" namespace="/" extends="struts-default"> <default-action-ref name="index"></default-action-ref> <action name="index" > <result>/error.jsp</result> </action> <action name="*_*_*" method="{2}" class="com.{3}.{1}Action"> <result>/result.jsp</result> <result name="add">/{2}.jsp</result> <result name="update">/{2}.jsp</result> </action></package></struts>
创建error.jsp,提示用户找不到界面。
运行http://localhost:8080/HelloWorld/aaa.action,将会调用默认error.jsp。
Struts2后缀:可在struts.xml、web.xml、struts.properties中配置。
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> <include file="helloworld.xml"></include> <constant name="struts.action.extension" value="html"></constant> <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant></struts>
运行http://localhost:8080/HelloWorld/HelloWorld_add_action.html
若不添加后缀,则<constant name="struts.action.extension" value=""></constant>
(此句也可省略)
接收参数:
1、使用Action的属性接收参数:
直接在Action类中创建相应的属性和它的getter和setter方法,和前端的name名字相同。eg:前端的username,在action类中就要建立一个private String username; Struts会自动映射为这个属性赋值。
2、使用DomainModel接受参数:
使用DomainModel,将username 和password两个属性封装为一个类User(必须是标准的JavaBean),并创建getter/setter,在action中声明这个属性:private User user; 同时为user设置getter和setter;在前端中的username需要设置为user.username和user.password,才能映射成功。
3、使用ModelDriver接受参数:
使用ModelDriven接口,在Action中实现ModelDriver<实体类名>接口,这个action必须实现这个接口的public T getModel()方法。此时声明的对象必须实例化,eg: private User user = new User(); 同时不需要getter和setter。前端的name也只需要写username和password就可以,不需要再加域了。这种方法时最推荐的方法,因为可以减少前后端的耦合。
eg(使用ModelDriver接受参数):
创建实体类User:
package com.po;import java.util.List;public class User { private String username; private String password; private List<String> bookList; private List<User> users; 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> getUsers() { return users; } public void setUsers(List<User> users) { this.users = users; }}
LoginAction:
package com.action;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;import com.po.User;public class LoginAction extends ActionSupport implements ModelDriven<User>{ private User user=new User();//必须实例化User对象,且删除getter/setter方法 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.getUsers().get(0).getUsername()); System.out.println(user.getUsers().get(1).getUsername()); return SUCCESS; } @Override public User getModel() { return user; //返回实例化对象 } }
login.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <body> <form action="LoginAction.action" method="post"> 用户名:<input type="text" name="username"> 密码:<input type="password" name="password"> 书籍1:<input type="text" name="bookList[0]"> 书籍2:<input type="text" name="bookList[1]"> 用户1:<input type="text" name="users[0].username"> 用户2:<input type="text" name="users[1].username"> <input type="submit" value="提交" /> </form> </body></html>
运行http://localhost:8080/HelloWorld/login.jsp
点击提交,控制台:
处理结果类型:
Struts1返回结果是ActionForward;
Struts2返回结果是String。提供代码复用性,有利于框架分离。
Action对象内置的5个属性(常量):
eg(INPUT):
在实体类User中增加属性及其getter/setter:
private int age;
helloworld.xml的LoginAction:
<action name="LoginAction" method="login" class="com.action.LoginAction"> <result>/success.jsp</result> <result name="input">/login.jsp</result> </action>
验证若年龄类型输入错误返回INPUT,或用户名未输入返回INPUT:
package com.action;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;import com.po.User;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.getUsers().get(0).getUsername()); System.out.println(user.getUsers().get(1).getUsername()); return SUCCESS; } @Override public User getModel() { return user; } @Override public void validate() { //以下代码也可写在login方法中,但注意要return INPUT; if (user.getUsername()==null || "".equals(user.getUsername())) { this.addFieldError("username", "用户名不能为空"); } } }
login.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><%@ taglib prefix="s" uri="/struts-tags" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <body> <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]"> 书籍2:<input type="text" name="bookList[1]"> 用户1:<input type="text" name="users[0].username"> 用户2:<input type="text" name="users[1].username"> 年龄:<input type="text" name="age"> <input type="submit" value="提交" /> </form> </body></html>
运行http://localhost:8080/HelloWorld/login.jsp
返回结果<result>
的子元素:
struts2框架默认parse属性为true(可不写),即支持OGNL表达式。
eg:
在helloworld.xml设置action:
<action name="*_*_*" method="{2}" class="com.{3}.{1}Action"> <result>/result.jsp</result> <result name="add"> <param name="location">/${#request.path}.jsp</param> </result> <result name="update">/{2}.jsp</result> <result name="error">/error.jsp</result> </action>
HelloWorldAction.java:
package com.action;import javax.servlet.http.HttpServletRequest;import org.apache.struts2.interceptor.ServletRequestAware;import com.opensymphony.xwork2.ActionSupport;public class HelloWorldAction extends ActionSupport implements ServletRequestAware{ private HttpServletRequest request; public String add(){ request.setAttribute("path","update"); return "add"; } public String update(){ return "update"; } @Override public String execute() throws Exception { //默认方法 System.out.println("执行Action"); return SUCCESS; //返回数据显示的视图的路径 } @Override public void setServletRequest(HttpServletRequest request) { this.request=request; //实例化request }}
运行:http://localhost:8080/HelloWorld/HelloWorld_add_action.action
返回结果<result>
标签中的type属性:
- Struts2
- struts2
- struts2
- Struts2
- struts2
- struts2
- Struts2
- struts2
- struts2
- struts2
- Struts2
- Struts2
- Struts2
- struts2
- struts2
- STRUTS2
- Struts2
- Struts2
- Python-Day4(函数式编程)
- Android JNI 动态注册方法(JNI_OnLoad)
- 195元爱奇艺会员只卖5元 揭秘背后黑色产业链
- ctags简易用法
- Sublime Text C/C++配置 支持输入 Mac环境下
- Struts2
- 在Editplus中配置java的(带包)编译(javac)和运行(java)的方法
- 超类对象引用变量引用子类对象
- mybatis generator 自定义类名(修改mybatis-generator-1.3.2源码改dao类名)
- Gym 100685G Gadget Hackwrench (LCA)
- RxJava 各种操作符(2)
- js播放不了多段语音
- Java 8新增的日期、时间格式器
- MySQL5.6生产库自动化安装部署