我正在尝试实现SEO 友好的 URL,例如/movies/{id}/actors/{actor_id}
指出特定电影的演员详细信息。所以我尝试使用Advanced Wildcard mappings,但是当我在我的项目中实现 REST API 时它不起作用,但在我有一个简单的 struts2 应用程序的项目中也是如此,它将 JSP 页面显示为结果。
以下是运行的简单 struts2 应用程序的文件:
struts.xml
<?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>
<constant name="struts.devMode" value="true" />
<constant name="struts.enable.SlashesInActionNames" value="true"/>
<constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>
<constant name="struts.patternMatcher" value="regex"/>
<constant name="struts.matcher.appendNamedParameters" value="true"/>
<package name="basicstruts2" extends="struts-default">
<action name="index">
<result>/index.jsp</result>
</action>
<action name="/{uid}/hello/{userName}" class="com.struts.kavin.action.HelloWorldAction" method="execute">
<result name="success">/hello_world.jsp</result>
</action>
</package>
</struts>
HelloWorldAction.java
package com.struts.kavin.action;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport {
private String userName;
private String uid;
public String execute(){
return SUCCESS;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
}
hello_world.jsp
<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello World!</title>
</head>
<body>
<p>Username: <s:property value="userName" /></p>
<p>UID: <s:property value="uid" /></p>
</body>
</html>
index.jsp
:显示超链接以导航到各个页面。
OUTPUT:
URL:
http://localhost:8080/Sample/dsadsadsad/hello/kavin.action
Displays:
UID:dsadsadsad
用户名:kavin
以下是不工作的 struts2 REST API 应用程序的文件:
struts.xml
<?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>
<constant name="struts.devMode" value="true"/>
<constant name="struts.convention.action.suffix" value="Controller"/>
<constant name="struts.convention.action.mapAllMatches" value="true"/>
<constant name="struts.convention.default.parent.package" value="rest-default"/>
<constant name="struts.convention.package.locators" value="action"/>
<constant name="struts.enable.SlashesInActionNames" value="true"/>
<constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>
<constant name="struts.patternMatcher" value="regex"/>
<constant name="struts.matcher.appendNamedParameters" value="true"/>
<constant name="struts.rest.content.restrictToGET" value="false"/>
<package name="movies" extends="rest-default, json-default">
<interceptors>
<interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>
<interceptor-stack name="jsonStack">
<interceptor-ref name="json"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<action name="movies" class="com.struts.movie.action.MoviesController">
<interceptor-ref name="jsonStack"/>
<result type="json">
<!-- declarations for mappings from Request JSON Body goes here-->
<param name="root">movie</param>
</result>
</action>
</package>
<package name="actors" namespace="/movies" extends="rest-default, json-default">
<interceptors>
<interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>
<interceptor-stack name="jsonStack">
<interceptor-ref name="json"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<action name="/{movie_id}/actors/" class="com.struts.movie.action.ActorsController">
<interceptor-ref name="jsonStack"/>
<!-- <param name="movie_id">{1}</param> -->
<result type="json">
<!-- declarations for mappings from Request JSON Body goes here-->
<param name="root">actor</param>
</result>
</action>
</package>
</struts>
ActorsController.java
package com.struts.movie.action;
public class ActorsController implements ModelDriven<Object> {
private Actor actor;
private String id;
private String movie_id;
private Object model;
@Override
public Object getModel() {
return model;
}
// RESETful method implementations
// Respective getters & setters are added
}
OUTPUT:
URL:
GET:
http://localhost:8080/movie_api/movies/1/actors.json
Error:
Struts 问题报告
Struts 检测到一个未处理的异常:
消息:没有为命名空间 /movies 和动作名称 1 映射的动作。堆栈跟踪没有为命名空间 /movies 和动作名称 1 映射的动作。 - [未知位置] com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java: 195) com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:76) org.apache.struts2.rest.RestActionProxyFactory.createActionProxy(RestActionProxyFactory.java:50) org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher. java:564) org.apache.struts2.dispatcher.ExecuteOperations.executeAction(ExecuteOperations.java:79) org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:141) org.mortbay.jetty.servlet。 ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) org.mortbay.jetty.servlet。ServletHandler.handle(ServletHandler.java:360) org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) org.mortbay。 jetty.handler.ContextHandler.handle(ContextHandler.java:726) org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:206) org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114) org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) org.mortbay.jetty.Server.handle(Server.java: 324)org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:第648章)jetty.HttpParser.parseAvailable(HttpParser.java:211) org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380) org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395) org.mortbay。 thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
有人可以帮我弄清楚应该怎么做才能让它工作吗?我也尝试<constant name="struts.mapper.class" value="org.apache.struts2.dispatcher.mapper.Restful2ActionMapper" />
从Restful2ActionMapper添加。