Struts2

来源:互联网 发布:苹果打击垫软件 编辑:程序博客网 时间:2024/06/05 14:17

访问Servlet API
Servlet API:

  1. HttpServletRequest
  2. HttpServletResponse
  3. 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属性:
这里写图片描述
这里写图片描述

0 0
原创粉丝点击