Struts的Action中获取Request和response对象

Struts2利用ServletActionContext维护Servlet对象,把Servlet对象放到了ServletActionContext中,

例如request、response、session、application

ServletActionContext利用ThreadLocal维护不同线程的Servlet对象,这种方式叫做非注入式(非IOC)。

不推荐使用这种方式,会存在线程不安全风险。

<span style="white-space:pre">		</span>HttpServletRequest request = ServletActionContext.getRequest();
		HttpServletResponse response = ServletActionContext.getResponse();
		HttpSession session = request.getSession();
		ServletContext context = ServletActionContext.getServletContext();

2. 利用Aware接口:

 Struts2提供了Aware接口,Aware为”感知“的意思,实现了相关的Aware接口的Action能够感知相关的资源。在serveltConfig拦截器中,Struts2在实例化Action时,如果发现实现了相关的Aware接口,会把相关资源通过Aware注入进去。同时这种方式也是推荐的,因为可以保证线程安全。
 

3、看下ServletConfigInterceptor

/*
 * $Id$
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.apache.struts2.interceptor;

import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.StrutsStatics;
import org.apache.struts2.servlet.interceptor.ServletPrincipalProxy;
import org.apache.struts2.util.ServletContextAware;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;


/**
 * <!-- START SNIPPET: description -->
 *
 * An interceptor which sets action properties based on the interfaces an action implements. For example, if the action
 * implements {@link ParameterAware} then the action context's parameter map will be set on it.
 *
 * <p/> This interceptor is designed to set all properties an action needs if it's aware of servlet parameters, the
 * servlet context, the session, etc. Interfaces that it supports are:
 *
 * <ul>
 *
 * <li>{@link ServletContextAware}</li>
 *
 * <li>{@link ServletRequestAware}</li>
 *
 * <li>{@link ServletResponseAware}</li>
 *
 * <li>{@link ParameterAware}</li>
 *
 * <li>{@link RequestAware}</li>
 *
 * <li>{@link SessionAware}</li>
 *
 * <li>{@link ApplicationAware}</li>
 *
 * <li>{@link PrincipalAware}</li>
 *
 * </ul>
 *
 * <!-- END SNIPPET: description -->
 *
 * <p/> <u>Interceptor parameters:</u>
 *
 * <!-- START SNIPPET: parameters -->
 *
 * <ul>
 *
 * <li>None</li>
 *
 * </ul>
 *
 * <!-- END SNIPPET: parameters -->
 *
 * <p/> <u>Extending the interceptor:</u>
 *
 * <p/>
 *
 * <!-- START SNIPPET: extending -->
 *
 * There are no known extension points for this interceptor.
 *
 * <!-- END SNIPPET: extending -->
 *
 * <p/> <u>Example code:</u>
 *
 * <pre>
 * <!-- START SNIPPET: example -->
 * <action name="someAction" class="com.examples.SomeAction">
 *     <interceptor-ref name="servletConfig"/>
 *     <interceptor-ref name="basicStack"/>
 *     <result name="success">good_result.ftl</result>
 * </action>
 * <!-- END SNIPPET: example -->
 * </pre>
 *
 * @see ServletContextAware
 * @see ServletRequestAware
 * @see ServletResponseAware
 * @see ParameterAware
 * @see SessionAware
 * @see ApplicationAware
 * @see PrincipalAware
 */
public class ServletConfigInterceptor extends AbstractInterceptor implements StrutsStatics {

    private static final long serialVersionUID = 605261777858676638L;

    /**
     * Sets action properties based on the interfaces an action implements. Things like application properties,
     * parameters, session attributes, etc are set based on the implementing interface.
     *
     * @param invocation an encapsulation of the action execution state.
     * @throws Exception if an error occurs when setting action properties.
     */
    public String intercept(ActionInvocation invocation) throws Exception {
        final Object action = invocation.getAction();
        final ActionContext context = invocation.getInvocationContext();

        if (action instanceof ServletRequestAware) {
            HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST);
            ((ServletRequestAware) action).setServletRequest(request);
        }

        if (action instanceof ServletResponseAware) {
            HttpServletResponse response = (HttpServletResponse) context.get(HTTP_RESPONSE);
            ((ServletResponseAware) action).setServletResponse(response);
        }

        if (action instanceof ParameterAware) {
            ((ParameterAware) action).setParameters((Map)context.getParameters());
        }

        if (action instanceof ApplicationAware) {
            ((ApplicationAware) action).setApplication(context.getApplication());
        }
        
        if (action instanceof SessionAware) {
            ((SessionAware) action).setSession(context.getSession());
        }
        
        if (action instanceof RequestAware) {
            ((RequestAware) action).setRequest((Map) context.get("request"));
        }

        if (action instanceof PrincipalAware) {
            HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST);
            if(request != null) {
                // We are in servtlet environment, so principal information resides in HttpServletRequest
                ((PrincipalAware) action).setPrincipalProxy(new ServletPrincipalProxy(request));
            }
        }
        if (action instanceof ServletContextAware) {
            ServletContext servletContext = (ServletContext) context.get(SERVLET_CONTEXT);
            ((ServletContextAware) action).setServletContext(servletContext);
        }
        return invocation.invoke();
    }
}


常用做法是:

定义一个baseAction,实现需要的Aware,让其他action继承此接口。

<span style="font-size:18px;">public BaseAction implements ServletContextAware, ServletRequestAware, ServletResponseAware, SessionAware 
	@Override
	public void setServletRequest(HttpServletRequest request) {
		try {
			request.setCharacterEncoding("UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}

	}

	@Override
	public void setServletResponse(HttpServletResponse response) {
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
	}

	@Override
	public void setSession(Map<String, Object> session) {
	}
	@Override
	public void setServletContext(ServletContext context) {
		this.context = context;
	}
</span>


 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JPetStore是一个使用Java和Struts框架开发的示例应用程序,用于演示如何使用Java技术构建Web应用程序。 下面是JPetStoreStruts代码示例: 1. struts-config.xml文件 这是Struts框架的配置文件,它定义了应用程序所有操作的配置。 ```xml <struts-config> <form-beans> <form-bean name="AccountForm" type="org.mybatis.jpetstore.web.actions.AccountActionForm"/> <form-bean name="CatalogForm" type="org.mybatis.jpetstore.web.actions.CatalogActionForm"/> <form-bean name="OrderForm" type="org.mybatis.jpetstore.web.actions.OrderActionForm"/> </form-beans> <global-exceptions> <exception key="error.database" type="org.mybatis.jpetstore.web.util.DBException"/> <exception key="error.exception" type="org.mybatis.jpetstore.web.util.GeneralException"/> <exception key="error.login.required" type="org.mybatis.jpetstore.web.util.AuthenticationException"/> </global-exceptions> <global-forwards> <forward name="welcome" path="/actions/Catalog.action"/> <forward name="failure" path="/error.jsp"/> </global-forwards> <action-mappings> <action path="/actions/Catalog.action" name="CatalogForm" scope="request" type="org.mybatis.jpetstore.web.actions.CatalogAction"> <forward name="success" path="/WEB-INF/jsp/catalog/Main.jsp"/> <forward name="failure" path="/error.jsp"/> </action> <action path="/actions/CatalogSearch.action" name="CatalogForm" scope="request" type="org.mybatis.jpetstore.web.actions.CatalogSearchAction"> <forward name="success" path="/WEB-INF/jsp/catalog/SearchProducts.jsp"/> <forward name="failure" path="/error.jsp"/> </action> <action path="/actions/ViewProduct.action" name="CatalogForm" scope="request" type="org.mybatis.jpetstore.web.actions.ViewProductAction"> <forward name="success" path="/WEB-INF/jsp/catalog/Product.jsp"/> <forward name="failure" path="/error.jsp"/> </action> <action path="/actions/AddItemToCart.action" name="CatalogForm" scope="session" type="org.mybatis.jpetstore.web.actions.AddItemToCartAction"> <forward name="success" path="/WEB-INF/jsp/catalog/Cart.jsp"/> <forward name="failure" path="/error.jsp"/> </action> <action path="/actions/RemoveItemFromCart.action" name="CatalogForm" scope="session" type="org.mybatis.jpetstore.web.actions.RemoveItemFromCartAction"> <forward name="success" path="/WEB-INF/jsp/catalog/Cart.jsp"/> <forward name="failure" path="/error.jsp"/> </action> <action path="/actions/ViewCart.action" name="CatalogForm" scope="request" type="org.mybatis.jpetstore.web.actions.ViewCartAction"> <forward name="success" path="/WEB-INF/jsp/catalog/Cart.jsp"/> </action> <action path="/actions/Checkout.action" name="OrderForm" scope="request" type="org.mybatis.jpetstore.web.actions.CheckoutAction"> <forward name="success" path="/WEB-INF/jsp/order/Checkout.jsp"/> </action> <action path="/actions/NewOrder.action" name="OrderForm" scope="request" type="org.mybatis.jpetstore.web.actions.NewOrderAction"> <forward name="success" path="/WEB-INF/jsp/order/ViewOrder.jsp"/> <forward name="failure" path="/error.jsp"/> </action> <action path="/actions/ListOrders.action" name="AccountForm" scope="request" type="org.mybatis.jpetstore.web.actions.ListOrdersAction"> <forward name="success" path="/WEB-INF/jsp/order/ListOrders.jsp"/> <forward name="failure" path="/error.jsp"/> </action> <action path="/actions/ViewOrder.action" name="OrderForm" scope="request" type="org.mybatis.jpetstore.web.actions.ViewOrderAction"> <forward name="success" path="/WEB-INF/jsp/order/ViewOrder.jsp"/> <forward name="failure" path="/error.jsp"/> </action> <action path="/actions/EditAccountForm.action" name="AccountForm" scope="request" type="org.mybatis.jpetstore.web.actions.EditAccountFormAction"> <forward name="success" path="/WEB-INF/jsp/account/EditAccountForm.jsp"/> <forward name="failure" path="/error.jsp"/> </action> <action path="/actions/EditAccount.action" name="AccountForm" scope="request" type="org.mybatis.jpetstore.web.actions.EditAccountAction"> <forward name="success" path="/WEB-INF/jsp/catalog/Main.jsp"/> <forward name="failure" path="/error.jsp"/> </action> <action path="/actions/SignonForm.action" scope="request" type="org.mybatis.jpetstore.web.actions.SignonFormAction"> <forward name="success" path="/WEB-INF/jsp/account/SignonForm.jsp"/> </action> <action path="/actions/Signon.action" name="AccountForm" scope="session" type="org.mybatis.jpetstore.web.actions.SignonAction"> <forward name="success" path="/WEB-INF/jsp/catalog/Main.jsp"/> <forward name="failure" path="/WEB-INF/jsp/account/SignonForm.jsp"/> </action> <action path="/actions/Signoff.action" scope="session" type="org.mybatis.jpetstore.web.actions.SignoffAction"> <forward name="success" path="/WEB-INF/jsp/catalog/Main.jsp"/> </action> </action-mappings> </struts-config> ``` 2. CatalogAction类 这是一个处理产品目录相关操作的类,它继承自StrutsAction类。 ```java public class CatalogAction extends BaseAction { public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String categoryId = request.getParameter("categoryId"); if (categoryId != null) { request.setAttribute("productList", CatalogFacade.getProductListByCategory(categoryId)); request.setAttribute("category", CatalogFacade.getCategory(categoryId)); } return mapping.findForward("success"); } } ``` 3. CatalogActionForm类 这是一个Struts表单类,它用于存储从JSP页面提交的表单数据。 ```java public class CatalogActionForm extends BaseActionForm { private String categoryId; public String getCategoryId() { return categoryId; } public void setCategoryId(String categoryId) { this.categoryId = categoryId; } } ``` 以上就是JPetStore的一些Struts代码示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值