zoukankan      html  css  js  c++  java
  • Struts2——结果跳转方式配置(重定向,转发<默认>,重定向到方法,重定向到转发),获取servlet的内些API(request,servletcontext...),获取参数

    一、结果跳转方式

    1)转发(默认)

    <!--  转发 -->
    <action name="Demo1Action" class="cn.itheima.a_result.Demo1Action" method="execute" >
    	<result name="success" type="dispatcher" >/hello.jsp</result>
    </action>
    

    2)重定向

    <!-- 重定向 -->
    <action name="Demo2Action" class="cn.itheima.a_result.Demo2Action" method="execute" >
    	<result name="success" type="redirect" >/hello.jsp</result>
    </action>
    

    3)转发到Action

    <!-- 转发到Action -->
    <action name="Demo3Action" class="cn.itheima.a_result.Demo3Action" method="execute" >
    	 <result name="success" type="chain">
    			<!-- action的名字 -->
    		 <param name="actionName">Demo1Action</param>
    			<!-- action所在的命名空间 -->
    		 <param name="namespace">/</param>
    	 </result>
    </action>
    

    4)重定向到Action

    <!-- 重定向到Action -->
    <action name="Demo4Action" class="cn.itheima.a_result.Demo4Action" method="execute" >
    	<result  name="success"  type="redirectAction">
    		 <!-- action的名字 -->
    		 <param name="actionName">Demo1Action</param>
    		 <!-- action所在的命名空间 -->
    		 <param name="namespace">/</param>
    	</result>
    </action>
    

    二、访问servlet的API

    注:域对象实际上就是一个Map

    获取这些对象的方法

    方法一:通过ActionContext(建议,只有它是获取的域对象:字典形式)

    //request域=> map (struts2并不推荐使用原生request域)
    //不推荐
    Map<String, Object> requestScope = (Map<String, Object>) ActionContext.getContext().get("request");
    //推荐(因为ActionContext的生命周期和request域相同)
    ActionContext.getContext().put("name", "requestTom");
    //session域 => map
    Map<String, Object> sessionScope = ActionContext.getContext().getSession();
    sessionScope.put("name", "sessionTom");
    //application域=>map
    Map<String, Object> applicationScope = ActionContext.getContext().getApplication();
    applicationScope.put("name", "applicationTom");

    获取方法

    <body>
    	request: ${requestScope.name}<br>
    	session:${sessionScope.name}<br>
    	application:${applicationScope.name}<br>
    </body>

    方法二:通过ServletActionContext

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

    方法三:通过实现接口方式

    public class Demo7Action extends ActionSupport implements ServletRequestAware {    // 如果想获得其他的,在实现其他接口
    	
    	
    	private HttpServletRequest request;
    
    	public String execute() throws Exception { 
    		
    		System.out.println("原生request:"+request);
    		return SUCCESS;
    	}
    
    	@Override
    	public void setServletRequest(HttpServletRequest request) {
    		this.request = request;
    	}
    
    	
    }
    

    Struts与Struts2的生命周期的区别

    Struts1的模式(servlet的生命周期)

    默认在第一次访问的时候实例化(init方法)servlet类

    然后每次请求来的时候执行service方法

    这样大家都修改同一个类成员变量,就会有线程不安全的隐患

    Struts2的模式

    每来一个请求实例化一个Action对象,请求结束销毁

    这样各自操作各自的,没有线程安全问题

    Struts MVC

    详情请看:这里

    三、接收参数

    方法一:属性驱动获得参数

    注:要有get,set方法

    方法二:对象驱动

    public class Demo9Action extends ActionSupport  {
    	//准备user对象
    	private User user;
    
    	public String execute() throws Exception { 
    		
    		System.out.println(user);
    		
    		return SUCCESS;
    	}
    
    	public User getUser() {  // 前两种方式都需要提供get,set方法
    		return user;
    	}
    
    	public void setUser(User user) {
    		this.user = user;
    	}
    
    	
    }
    

    方法三:模型驱动

     

    public class Demo10Action extends ActionSupport implements ModelDriven<User> {	// 实现接口
    	//准备user 成员变量
    	private User user =new User();
    
    	public String execute() throws Exception { 
    		
    		System.out.println(user);
    		
    		return SUCCESS;
    	}
    
    	@Override
    	public User getModel() {
    		return user;
    	}
    }
    

    其他:获取list,map

    list

    Map

     

  • 相关阅读:
    Linux使用定时器timerfd 和 eventfd接口实现进程线程通信
    C++面向对象实现封装线程池
    生产者与消费者问题,C++利用bind基于对象实现与面向对象实现
    C++11新特性,bind,基于对象
    [HDU
    [HDU
    [HDU
    【BZOJ3707】圈地 (几何,旋转坐标系)
    [HDU
    [Codeforces Round #595 (Div. 3)] F. Maximum Weight Subset (树形DP)
  • 原文地址:https://www.cnblogs.com/x54256/p/8474410.html
Copyright © 2011-2022 走看看