strurts2 中的 ActionMapper的 作用

最近在项目中要做http api,要求提供的url是 http://***.domain.com/api/rest?sign={签名}&method={namespace}.{action名}.{调用方法名}&......

 

类似淘宝的top api url 风格,一个url,根据参数不同,映射到不同的控制器。

 

实现方法详细:

 

1、实现自己的ActionMapper,通过method参数将请求转发到具体的action

public class RestActionMapper extends DefaultActionMapper {

	private static final Pattern p = Pattern
			.compile("([^\\.]+?)\\.([^\\.]+?)\\.([^\\.]+?)$");

	@Override
	public ActionMapping getMapping(HttpServletRequest request,
			ConfigurationManager configManager) {

		ActionMapping mapping = new ActionMapping();

		final String method = request.getParameter("method");
		if (method == null) {
			throw new IllegalArgumentException("param method can not be null");
		}
		Matcher m = p.matcher(method);
		if (!m.matches()) {
			throw new RuntimeException("method" + method + " unmatch pattern:"
					+ p);
		}

		mapping.setNamespace("/" + m.group(1));
		mapping.setName(m.group(2));
		mapping.setMethod(m.group(3));

		return mapping;
	}

}

 2、在struts.xml增加配置,将默认的actionmapper换成自定义的

<bean type="org.apache.struts2.dispatcher.mapper.ActionMapper"
		name="api_rest" class="com.my.profile.struts.RestActionMapper" />
<constant name="struts.mapper.class" value="api_rest" />

 

3、在web.xml中,这样将接收/api/rest 的所有请求

<filter>
		<filter-name>struts2</filter-name>
		<filter-class>
			org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/api/rest</url-pattern>
	</filter-mapping>

 

struts2很强大

你可能感兴趣的:(action)