• struts2结果跳转和参数获取


    一、结果跳转方式

    <?xml version="1.0" encoding="UTF-8"?>
     <!DOCTYPE struts PUBLIC
    	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
    	"http://struts.apache.org/dtds/struts-2.5.dtd">
    <struts>
    	<!-- 指定struts2是否以开发者模式运行,以开发者模式运行会有更多的方便之处 可以热加载主配置文件,提供更多的日志信息输出,方便开发时调试 -->
    	<constant name="struts.devMode" value="true"></constant>
    
    	<!-- package元素:不对应Java源文件的任何一个包,只是struts2框架的将Action进行封装,就是在一个package中可以配置很多Action 
    		name属性:给包起个名字,起标识作用,随便起,一般见名知意即可。不能与其他包名重复 namespace属性:给action的访问路径中定义一个命名空间,方便从路径上区分不同的模块 
    		extends属性:继承另一个指定的包,struts-default是struts框架内置的一个包,必须继承它 abstract属性:标明包是否是抽象的,标识性属性,标识该包不能独立运行,专门被继承,类似Java中的抽象类 -->
    	<package name="result" namespace="/" extends="struts-default">
    		<!-- action元素:配置Action类 name属性:决定了Action访问资源名 class属性:Action的完整类名 method属性:指定调用Action中的哪个方法来处理请求 -->
    		
    		<!-- 转发 -->
    		<action name="Demo1Action" class="com.fei.a_result.Demo1Action" method="execute">
    			<!-- result元素: name属性:标识结果处理的名称与Action方法的返回值对应 type属性:指定调用哪个Result类里处理结果,默认使用转发,具体有哪些类型,可以查看struts-default.xml配置文件,该文件位于struts2的核心包下 
    				标签体:填写页面的相对路径 -->
    			<!-- 在struts2.3之前的版本,正常的配置就可以了,但在struts2.3版本之后, 使用通配符调用方法时,内部会验证是否允许访问该方法,所以要加上下面的代码 -->
    			<result name="success" type="dispatcher">/hello.jsp</result>
    			<allowed-methods>execute</allowed-methods>
    		</action>
    
    		<!-- 重定向 -->
    		<action name="Demo2Action" class="com.fei.a_result.Demo2Action" method="execute">
    			<result name="success" type="redirect">/hello.jsp</result>
    			<allowed-methods>execute</allowed-methods>
    		</action>
    		
    		<!-- 访问Demo3Action完成之后会转发到/命名空间下的Demo1Action,但是这种Action之间的转发方式不常用 -->
    		<action name="Demo3Action" class="com.fei.a_result.Demo3Action" method="execute">
    			<result name="success" type="chain">
    				<param name="actionName">Demo1Action</param>
    				<param name="namespace">/</param>
    			</result>
    		</action>
    		
    		<!-- 重定向到另一个命名空间/下的Action,这是比较常用的 -->
    		<action name="Demo4Action" class="com.fei.a_result.Demo4Action" method="execute">
    			<result name="success" type="redirectAction">
                 <param name="actionName">Demo1Action</param>
                 <param name="namespace">/</param>
             </result>
    		</action>
    	</package>
    </struts>
    	 
    

    二、获得原生servlet对象的数据中心ActionContext

    • 原生request对象--HttpServletRequest
    • 原生response对象--HttpServletResponse
    • 原生ServletContext--ServletContext
    • request域(一个Map)
    • session域
    • application域
    • param参数
    • attr域(3个域合一)等等很多

    ActionContext也是一个Map

    其生命周期为: 每次请求时都会创建一个与请求对应ActionContext对象,请求处理完ActionContext销毁。

    如何获得ActionContext域

    struts2设计的是,将ActionContext对象创建好后,将ActionContext与当前想成绑定。因此需要获得ActionContext,只需要从ThreadLocal中获取即可。

    方式一(通过ActionContext,不推荐)

    // 向域中存数据
    		ActionContext.getContext().put("name", "requestTom");
    		// session域
    		Map<String, Object> sessionScope = ActionContext.getContext().getSession();
    		sessionScope.put("name", "sessionTom");
    		// application域
    		Map<String, Object> applicationScope = ActionContext.getContext().getApplication();
    		applicationScope.put("name", "applicationTom");
    

    取的时候和servlet一样,使用el表达式取即可

    requst:${requestScope.name }<br>
    session:${sessionScope.name }<br>
    application:${applicationScope.name }<br>
    

    方式二(通过ServletActionContext,也不推荐)

    // 原生request
    		HttpServletRequest request = ServletActionContext.getRequest();
    		// 原生response
    		HttpServletResponse response = ServletActionContext.getResponse();
    		// 原生ServletContext
    		ServletContext servletContext = ServletActionContext.getServletContext();
    		// 原生session
    		HttpSession session = request.getSession();
    

    方式三

    public class Demo7Action extends ActionSupport implements ServletRequestAware, ServletResponseAware {
    
    	private HttpServletRequest request;
    	private HttpServletResponse response;
    
    	public String execute() throws Exception {
    		System.out.println("原生request对象:" + request);
    		System.out.println("原生response对象:" + response);
    		return SUCCESS;
    	}
    
    	@Override
    	public void setServletRequest(HttpServletRequest request) {
    		this.request = request;
    	}
    
    	@Override
    	public void setServletResponse(HttpServletResponse response) {
    		this.response = response;
    	}
    // 注入原生域对象参见源码ServletConfigInterceptor.class
    }
    

    结论

    这三种方式其实质就是一个,获得的都是原生的api,方式一(通过ActionContext)比较常用。

    strutsMVC

    • filter-->C
    • Action-->M
    • Result-->V

    Action生命周期

    • 每次请求时,都会创建一个新的action实例
    • Action是线程安全的,可以使用成员变量接收参数

    二、获得参数

    获得参数方式一:属性驱动获得参数(准备与参数键名称相同的属性并提供set、get方法)

    public class Demo8Action extends ActionSupport {
    
    	private String name;
    	// struts框架会自动类型转换,但是只能转换八大基本数据类型及包装类
    	private Integer age;
    	// struts2还支持将特定字符串转换为Date,yyyy-MM-dd
    	private Date birthday;
    
    	public Demo8Action() {
    		// 每次访问都会创建一个新的Action
    		System.out.println("Demo8Action被创建了");
    	}
    
    	public String execute() throws Exception {
    		System.out.println("name参数值为:" + name);
    		System.out.println("age参数值为:" + age);
    		System.out.println("birthday参数值为:" + birthday);
    		return SUCCESS;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public Integer getAge() {
    		return age;
    	}
    	public void setAge(Integer age) {
    		this.age = age;
    	}
    	public Date getBirthday() {
    		return birthday;
    	}
    	public void setBirthday(Date birthday) {
    		this.birthday = birthday;
    	}
    }
    
    
    页面内容为:
    <form action="${pageContext.request.contextPath }/Demo8Action">
    	用户名:<input type="text" name="name"/><br>
    	年龄:<input type="text" name="age"/><br>
    	生日:<input type="text" name="birthday"/><br>
    	<input type="submit" value="提交"/>
    </form>
    

    获得参数方式二:对象驱动

    Action
    public class Demo9Action extends ActionSupport {
    	// 准备User对象
    	private User user;
    
    	public Demo9Action() {
    		// 每次访问都会创建一个新的Action
    		System.out.println("Demo8Action被创建了");
    	}
    	public String execute() throws Exception {
    		System.out.println("user参数值为:" + user);
    		return SUCCESS;
    	}
    	public User getUser() {
    		return user;
    	}
    	public void setUser(User user) {
    		this.user = user;
    	}
    }
    
    html表单代码
    <form action="${pageContext.request.contextPath }/Demo9Action">
    	<!-- 提交到对应Action的user对象的name属性 -->
    	用户名:<input type="text" name="user.name"/><br>
    	年龄:<input type="text" name="user.age"/><br>
    	生日:<input type="text" name="user.birthday"/><br>
    	<input type="submit" value="提交"/>
    </form>
    

    获得参数方式三:模型驱动

    • 属性是有get、set方法的
    • 成员是没有get、set方法的
    后台Action代码
    public class Demo10Action extends ActionSupport implements ModelDriven<User> {
    	// 准备User对象
    	private User user = new User();
    
    	public Demo10Action() {
    		// 每次访问都会创建一个新的Action
    		System.out.println("Demo10Action被创建了");
    	}
    
    	public String execute() throws Exception {
    		System.out.println("user参数值为:" + user);
    		return SUCCESS;
    	}
    
    	@Override
    	public User getModel() {
    		return user;
    	}
    
    }
    
    前台页面代码
    <form action="${pageContext.request.contextPath }/Demo10Action">
    	<!-- 提交到对应Action的user对象的name属性 -->
    	用户名:<input type="text" name="name"/><br>
    	年龄:<input type="text" name="age"/><br>
    	生日:<input type="text" name="birthday"/><br>
    	<input type="submit" value="提交"/>
    </form>
    

    此方法缺点就是当页面提交多个对象时,不好处理。

  • 相关阅读:
    ubuntu linux切换用户到root
    passwd命令
    如何根据驱动程序及其安装文件来访问该设备[转]
    CMMI的5个级别和25个过程域
    Linux操作系统启动过程
    VMWare上网三种工作模式
    卷积的意义【转】
    Linux内核模块动态添加方法
    Linux内核编译的过程
    mysql存入中文乱码解决方法(windows环境)
  • 原文地址:https://www.cnblogs.com/zxfei/p/11154553.html
Copyright © 2020-2023  润新知