Spring MVC + JPA + Hibernate + GlassFish V3 + MySQL 实现J2EE应用的常用配置模板详解

来源:互联网 发布:回文数组 编辑:程序博客网 时间:2024/05/16 06:51

首先是web.xml

 

<?xml version="1.0" encoding="UTF-8"?><web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"><!--设置spring在本应用程序中的配置加载监听器 --><!--监听器会在应用程序启动时自动实例化 --><!--ContextLoaderListener实例化后自动寻找WEB-INF下的applicationContext.xml配置文件 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><context-param><param-name>contextConfigLocation</param-name><!--注意这里,如果你的项目中有多个spring上下文DI配置文件 不要写成classpath:applicationContext*.xml的形式 --><!--一定要写成/WEB-INF/classes/...的形式,resin和glassfish在这里貌似不认这样的写法 --><!--我最近在迁移代码的时候就出现了DAO层和Service层无法注入到Controller的问题,罪魁祸首就因为它 --><param-value>/WEB-INF/classes/applicationContext*.xml</param-value></context-param><!--解决spring乱码问题 --><filter><filter-name>encoding</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>encoding</filter-name><url-pattern>/*</url-pattern></filter-mapping><!--全局Servlet调度配置 --><servlet><!--若设置 servlet-name为[name] --><!--则DispatcherServlet在实例化后会自动加载[name]-servlet.xml --><servlet-name>spring</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><!--显式声明Servlet配置文件路径及其名称 --><param-value>/WEB-INF/classes/spring-servlet.xml</param-value></init-param><!--随服务器一同启动 --><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>spring</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping><!--错误页转向配置 --><error-page><error-code>404</error-code><location>/error.html</location></error-page><!--首页文件名设置 --><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.jsp</welcome-file></welcome-file-list><!--设置持久化单元引用 --><!--此配置仅当Servlet容器支持Servlet 2.5时有效 --><!--此时读取JPA配置文件 文件路径:类路径/META-INF/persistence.xml --><persistence-unit-ref><!--此处的引用名称一般习惯性写法为:persistence/持久化单元名称 --><!--此值被applicationContext.xml使用 --><persistence-unit-ref-name>persistence/stu_infoPU</persistence-unit-ref-name><!--此处的persistence-unit-name值与persistence.xml中persistence-unit的name属性对应 --><persistence-unit-name>stu_infoPU</persistence-unit-name></persistence-unit-ref></web-app>

2013年7月12日补充:最近手里有个项目要从tomcat服务器转为用Glassfish服务器。但是仿照本文配置的过程中一直提示错误。
 org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [一个Service接口] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.annotation.Resource(shareable=true, mappedName=, description=, name=, type=class java.lang.Object, authenticationType=CONTAINER, lookup=)}
这说明Controller层已经实例化了,只是DAO层和Service层没有实例化。既然这个项目以前在Tomcat能跑起来,说明是配置的问题。虽然查阅了很多资料但都没什么帮助,后来无意间注意到了web.xml中关于ContextLoaderListener的配置,<context-param>中指定的applicationContext文件是以classpath:applicationContext*.xml这样描述的,我改成了/WEB-INF/classes/applicationContext*.xml之后就能正常注入并启动了。为了保险起见,我吧Controller层的初始化配置文件classpath:spring-servlet.xml也弄成了/WEB-INF/classes/spring-servlet.xml。这下就万无一失了。

 

其次是类路径下的META-INF/persistence.xml

 

<?xml version="1.0" encoding="UTF-8"?><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="stu_infoPU" transaction-type="JTA"><provider>org.hibernate.ejb.HibernatePersistence</provider><!--设置从应用服务器的JNDI树种查找哪一个具体的JDBC资源 --><jta-data-source>jdbc/stu_info</jta-data-source><properties><property name="dialect" value="org.hibernate.dialect.MySQLDialect"></property><property name="hibernate.show_sql" value="true"></property></properties></persistence-unit></persistence>


然后是applicationContext.xml

 

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:jee="http://www.springframework.org/schema/jee"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd           http://www.springframework.org/schema/context           http://www.springframework.org/schema/context/spring-context-3.0.xsd           http://www.springframework.org/schema/aop            http://www.springframework.org/schema/aop/spring-aop-3.0.xsd           http://www.springframework.org/schema/jee           http://www.springframework.org/schema/jee/spring-jee-3.0.xsd           http://www.springframework.org/schema/tx           http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"><!--此配置文件中的所有配置要优先于spring-servlet.xml的配置加载 --><context:component-scan base-package="service,util" /><!--启用Spring的任务调度编程模式 使其识别@Scheduled注解 --><task:executor id="executor" pool-size="5" /><task:scheduler id="scheduler" pool-size="10" /><task:annotation-driven executor="executor" scheduler="scheduler" /><!--与持久化相关的配置 --><!--jndi-name用于指示从web.xml中读取哪一个持久化单元 --><!--使用web.xml中的persistence-unit-ref-name所指定的值 --><!--查找链: --><!--通过jdni-name在web.xml中查找persistence-unit-ref节点的子节点 --><!--查找有无与jdni-name所指定名称匹配的persistence-unit-ref-name --><!--根据匹配到的persistence-unit-ref-name得到persistence-unit-name --><!--根据persistence-unit-name在类路径/META-INF/persistence.xml中查找与之匹配的persistence-unit --><!--加载在persistence.xml中相关的配置 并实例化实体管理器工厂类 --><jee:jndi-lookup id="entityManagerFactory" jndi-name="persistence/stu_infoPU" /><!--开启从应用服务器的JNDI树中自动获取事务性DataSource --><tx:jta-transaction-manager /><!--激活@Transactional注解驱动的事务行为 --><!--此处设置的transaction-manager为transactionManager --><tx:annotation-driven transaction-manager="transactionManager" /></beans>



最后是spring-servlet.xml

 

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"><!--针对控制器返回视图字符串的修饰 最终视图路径为 [prefix][returnValue][suffix] --><!--例如prefix="/WEB-INF/" returnValue="admin/login" suffix=".jsp" --><!--最终的URL为 /WEB-INF/admin/login.jsp --><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="viewClass"value="org.springframework.web.servlet.view.JstlView" /><property name="prefix" value="/WEB-INF/pages/" /><property name="suffix" value=".jsp" /></bean><!--此处配置将 controller包和util包及其子包内部 --><!--包含注解 @Service @Component @Controller @Repository的类全部自动注入 --><context:component-scan base-package="controller" /><!--为spring设置注解映射路径支持 @RequestMapping --><beanclass="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /><beanclass="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /><!--设置spring拦截器 --><mvc:interceptors><!--若mvc:mapping的path相同则按照配置先后形成拦截器链 --><mvc:interceptor><mvc:mapping path="/*" /><bean class="interceptor.TestInterceptor1" /></mvc:interceptor><mvc:interceptor><mvc:mapping path="/*" /><bean class="interceptor.TestInterceptor2" /></mvc:interceptor></mvc:interceptors></beans>


接下来就是配置GlassFish了。

我将GlassFish安装在了D盘。下面是删除默认域domain1及创建自定义域stu_info的过程

 


C:\Documents and Settings\chaijunkun>d:

D:\>cd glassfish3

D:\glassfish3>cd glassfish

D:\glassfish3\glassfish>cd bin

D:\glassfish3\glassfish\bin>asadmin
使用“exit”以退出, 使用“help”以获得联机帮助。
asadmin> delete-domain domain1
已删除域 domain1。
已成功执行命令 delete-domain。
asadmin> create-domain stu_info
请输入管理员用户名 [按 Enter 键将接受默认值 "admin"/无密码]>【按回车继续】
使用 Admin 的默认端口 4848。
使用 HTTP Instance 的默认端口 8080。
使用 JMS 的默认端口 7676。
使用 IIOP 的默认端口 3700。
使用 HTTP_SSL 的默认端口 8181。
使用 IIOP_SSL 的默认端口 3820。
使用 IIOP_MUTUALAUTH 的默认端口 3920。
使用 JMX_ADMIN 的默认端口 8686。
使用 OSGI_SHELL 的默认端口 6666。
使用 JAVA_DEBUGGER 的默认端口 9009。
无法找到使用在 [D:\glassfish3\glassfish\lib\templates\locales\zh_CN\index.html]
中指定的语言环境 [zh_CN] 的文件。使用默认的 (en_US) index.html。
自签名 X.509 服务器证书的标识名为:
[CN=MicrosoftUser,OU=GlassFish,O=Oracle Corporation,L=Santa Clara,ST=Ca
lifornia,C=US]
自签名 X.509 服务器证书的标识名为:
[CN=MicrosoftUser,OU=GlassFish,O=Oracle Corporation,L=Santa Clara,ST=Ca
lifornia,C=US]
找不到域初始化程序,将绕开自定义步骤
已创建域 stu_info。
域 stu_info 管理员端口为 7982。
域 stu_info 允许管理员以用户 "admin"(无密码)身份登录。
已成功执行命令 create-domain。

建立好域之后不急着开启域,由于要是用MySQL数据库,需要先将MySQL数据库的Connector拷贝到域的库目录下。

我用的MySQL connector是mysql-connector-java-5.1.17-bin.jar,MySQL的官方提供了下载。

由于我将GlassFish V3安装到了D:\glassfish3,所以需要将该文件拷贝到D:\glassfish3\glassfish\domains\stu_info\lib\目录下。

拷贝完成后,该connector的完整文件名应为:D:\glassfish3\glassfish\domains\stu_info\lib\mysql-connector-java-5.1.17-bin.jar

下面回到命令行启动新建立的stu_info域

asadmin> start-domain stu_info
正在等待 stu_info 启动 ...............
成功启动了 domain : stu_info
domain  位置: D:\glassfish3\glassfish\domains\stu_info
日志文件: D:\glassfish3\glassfish\domains\stu_info\logs\server.log
管理端口: 4848
已成功执行命令 start-domain。
asadmin>

此时打开浏览器,输入:http://127.0.0.1:4848

进入GlassFish V3的GUI管理系统

 

左侧“日常任务”导航栏中找到JDBC配置区域,由于是新建的域,只存在默认的JDBC资源。需要新建一个适合应用的JDBC资源。

 

点击JDBC连接池

 

 

点击右侧新建按钮,填入如下信息

 

 

点击“下一步”

 

 

选择数据源类名称,勾选Ping启用选项。向下拖动,还有其他属性。这里只保留关键的属性,很简单,就不一一解释了

 

 

点击右下角的“完成”。如果没问题,会在页面上方提示“Ping成功”

 

接下来添加JDBC数据源

 

点击JDBC资源,在右侧点击“新建”按钮

 

 

按照约定俗成的习惯,这里的JNDI名称以jdbc开头,加“/”后接JDBC连接池名称。池选择刚刚新建的stu_info连接池,

点击“确定”按钮

 

 

新的JDBC数据源就添加好了。

接下来就是用MyEclipse将写好的Web应用部署到GlassFish上了。部署好后再开启stu_info域。在左侧“应用程序”中会看到所部署的Web应用。

 


配置好这些以后,如果Web应用程序没有问题的话,访问的路径为http://127.0.0.1:8080/stu_info/。URL中的stu_info是由应用程序名称决定的。

如果想去掉这个名称,在浏览器中直接输入http://127.0.0.1:8080/就能访问Web应用程序则应进行如下配置:

点击日昌任务下配置节点,选择server-config 配置项。找到虚拟服务器,选中名称为server的虚拟服务器



在右侧出现虚拟服务器配置界面:



其中默认Web模块是空的。在下拉列表中选择刚刚部署的Web应用程序,点击“应用”,即可生效。此时即可直接访问:

http://127.0.0.1:8080

 

 

另外,千万要记住工程名、连接池、JDBC数据源中避免出现spring这个单词。我之前因为在学习,想做一个使用spring框架的demo,就把工程名称和工程内的JPA数据连接配置都写成了“spring”或“jdbc/spring”,结果调试了好几天都提示Unable to retrieve EntityManagerFactory forunitName XXX,从而创建不了实体管理器entityManager。后来经高人指点,改了个名字就都迎刃而解了。

原创粉丝点击