Java Struts2+;弹簧&x2B;JPA(Hibernate):动作映射问题
我正在尝试这样的集成:Struts2+Spring+JPA(Hibernate)。 这个示例遇到了一个常见的struts异常,例如,我自己无法解决这个异常。 提交时,我有:HTTP状态404-没有为名称空间/和操作名称保存映射的操作。Java Struts2+;弹簧&x2B;JPA(Hibernate):动作映射问题,java,spring,jpa,struts2,struts-config,Java,Spring,Jpa,Struts2,Struts Config,我正在尝试这样的集成:Struts2+Spring+JPA(Hibernate)。 这个示例遇到了一个常见的struts异常,例如,我自己无法解决这个异常。 提交时,我有:HTTP状态404-没有为名称空间/和操作名称保存映射的操作。 <package name="person" extends="struts-default"> <action name="list" method="execute" class="personAction">
<package name="person" extends="struts-default">
<action name="list" method="execute" class="personAction">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
<action name="save" class="personAction" method="save">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
</package>
感谢所有能告诉我哪里错了的人。
以下是我使用的代码:
<package name="person" extends="struts-default">
<action name="list" method="execute" class="personAction">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
<action name="save" class="personAction" method="save">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
</package>
persistence.xml
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="punit">
</persistence-unit>
<package name="person" extends="struts-default">
<action name="list" method="execute" class="personAction">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
<action name="save" class="personAction" method="save">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
</package>
<package name="person" extends="struts-default">
<action name="list" method="execute" class="personAction">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
<action name="save" class="personAction" method="save">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
</package>
struts.xml
<package name="person" extends="struts-default">
<action name="list" method="execute" class="personAction">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
<action name="save" class="personAction" method="save">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
</package>
<package name="person" extends="struts-default">
<action name="list" method="execute" class="personAction">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
<action name="save" class="personAction" method="save">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
</package>
pages/list.jsp
pages/list.jsp
pages/list.jsp
pages/list.jsp
<package name="person" extends="struts-default">
<action name="list" method="execute" class="personAction">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
<action name="save" class="personAction" method="save">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
</package>
applicationContext.xml
<package name="person" extends="struts-default">
<action name="list" method="execute" class="personAction">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
<action name="save" class="personAction" method="save">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
</package>
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean id="personService" class="it.vigorelli.service.PersonServiceImpl" />
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="MYSQL" />
<property name="showSql" value="true" />
</bean>
</property>
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
....
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="personAction" scope="prototype" class="it.vigorelli.action.PersonAction">
<constructor-arg ref="personService" />
</bean>
....
web.xml
<package name="person" extends="struts-default">
<action name="list" method="execute" class="personAction">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
<action name="save" class="personAction" method="save">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
</package>
<filter>
<filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
<filter-class>
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
Spring OpenEntityManager视图过滤器
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
Spring OpenEntityManager视图过滤器
/*
支柱2
org.apache.struts2.dispatcher.FilterDispatcher
支柱2
/*
org.springframework.web.context.ContextLoaderListener
index.jsp
<package name="person" extends="struts-default">
<action name="list" method="execute" class="personAction">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
<action name="save" class="personAction" method="save">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
</package>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<body>
<s:form action="save" validate="true">
<s:textfield name="firstName" required="true" label="First Name"></s:textfield>
<s:textfield name="lastName" required="true" label="Last Name"></s:textfield>
<s:submit />
</s:form>
</body>
<package name="person" extends="struts-default">
<action name="list" method="execute" class="personAction">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
<action name="save" class="personAction" method="save">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
</package>
PersonAction.java
<package name="person" extends="struts-default">
<action name="list" method="execute" class="personAction">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
<action name="save" class="personAction" method="save">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
</package>
package it.vigorelli.action;
import java.util.List;
import it.vigorelli.model.Person;
import it.vigorelli.service.PersonService;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.Preparable;
public class PersonAction implements Preparable {
private PersonService service;
private List<Person> persons;
private Person person;
private Integer id;
public PersonAction(PersonService service) {
this.service = service;
}
public String execute() {
this.persons = service.findAll();
return Action.SUCCESS;
}
public String save() {
this.service.save(person);
this.person = new Person();
return execute();
}
public String remove() {
service.remove(id);
return execute();
}
public List<Person> getPersons() {
return persons;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public void prepare() throws Exception {
if (id != null)
person = service.find(id);
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
package it.vigorelli.action;
导入java.util.List;
导入it.vigorelli.model.Person;
导入it.vigorelli.service.PersonService;
导入com.opensymphony.xwork2.Action;
导入com.opensymphony.xwork2.Preparable;
公共类PersonAction实现了Preparable{
私人人事服务;
私人名单人员;
私人;
私有整数id;
公众人物(个人服务){
服务=服务;
}
公共字符串execute(){
this.persons=service.findAll();
回报行动。成功;
}
公共字符串保存(){
本.服务.保存(人);
this.person=新人();
返回execute();
}
公共字符串删除(){
服务。删除(id);
返回execute();
}
公众人士名单{
返回人员;
}
公共整数getId(){
返回id;
}
公共无效集合id(整数id){
this.id=id;
}
public void prepare()引发异常{
如果(id!=null)
person=service.find(id);
}
公众人物{
返回人;
}
公众人士{
这个人=人;
}
}
在
元素中,类
属性必须是完全限定的类名it.vigorelli.action.PersonAction
这个问题有一个非常简单的解决方案:在WEB-INF/classes文件夹中导出struts.xml文件。现在,Spring可以识别Struts的动作 他使用的是Spring,它允许您放置一个标识符来从SpringsApplicationContext
中提取操作。无论如何,谢谢您,但是在这个上下文中(Spring是管理struts操作的主要代理)我必须在标记中使用applicationContext.xml中声明的唯一id。如果源目录中有struts.xml
,那么构建脚本(或IDE)应该自动将其放入WEB-INF/classes
。你说得对。我从一个maven项目开始,这个项目变成了一个动态web项目。那里有一个src文件夹和struts.xml。maven项目将src/main/java、src/main/resources等作为源文件夹导出到WEB-INF/classes中作为默认值。因此,我在src/main/resources中移动了struts.xml,它可以正常工作。
<package name="person" extends="struts-default">
<action name="list" method="execute" class="personAction">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
<action name="save" class="personAction" method="save">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
</package>