IntelliJ IDEA关于SSH(Struts2, Spring, Hibernate)框架的搭建
这学期的Web作业要求用这个框架来搭建一个Web App,这里快乐地记一下自己的实现步骤。
本工程没有使用maven、gradle等构建工具。
本框架对应使用数据库MySQL,并采用C3P0连接池,下载地址:https://sourceforge.net/projects/c3p0/
创建项目
新建项目。左侧选择Spring,右侧选择Struts2, Application Server, Hibernate,点击库名后会在下方出现相应的配置,没有本地库的选择Download就可以,在配置选项完成之后IDE会自动下载对应的jar。
之后Next→工程起名→Finish。
接下来会有或长或短的一段配置时间。如果之前有选过Download,则会先自动下载对应的jar包。
导入其他相关的jar包
项目创建完成之后,需要手动往项目中导入需要的其他jar包。导入方法是将jar文件放入工程的lib目录下,然后在IDE中进行相关配置。
- mysql-connector-java:MySQL的java驱动,下载地址:https://dev.mysql.com/downloads/connector/j/
- c3p0连接池相关的包,本文最开始已提供下载地址:https://sourceforge.net/projects/c3p0/
- spring-web,下载地址:https://mvnrepository.com/artifact/org.springframework/spring-web
- struts2-spring-plugin,下载地址:https://mvnrepository.com/artifact/org.apache.struts/struts2-spring-plugin
添加数据库
接下来配置数据库。
选择IDE最右侧栏的Database标签,点击加号,选择Data Source中的MySQL:
先填URL,之后Name、Host、Database等会自动生成,然后填好用户名和密码,单击Test Connection,显示连接成功后,单击OK。
这是就会在窗口中看到刚连接好的数据库了:
我们可以通过这个小工具代替MySQL的Shell或者Workbench使用。
创建实体类和ORM文件
接下来要创建的是数据库各表对应的实体类了,这里IDE可以全部自动生成。具体操作见下:
单击IDE左下方的Persistence,在弹出标签页的工程名那里右键,选择Generate Persistence Mapping中的By Database Schema。
按下图所示进行操作:
配置完成后,就可以看到在所选的包下生成了数据表对应的实体类和hbm.xml文件。
至此,持久化类已生成完毕。
本框架会涉及到4个xml配置文件:
- web.xml - web application
- struts.xml - struts2
- hibernate.cfg.xml - Hibernate
- applicationContext.xml - Spring
配置web.xml
web.xml需要添加对struts2和spring的支持,其中struts2的部分(过滤器)已经自动配置好了:
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
接下来只需要配置spring的部分:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:/applicationContext.xml</param-value> </context-param>
配置struts.xml
struts.xml中主要配置的是各种action,在和spring搭配使用的情况下,action的class需要与spring生成的JavaBean的id对应。
添加action的示例如下:
<struts> <constant name="struts.objectFactory" value="spring"/>
<package name="blogPkg" namespace="/blogs" extends="struts-default"> <action name="login" class="login"> <result name="login">UserLogin.jsp</result> </action> <action name="signup" class="signup"> <result name="signup">UserSignup.jsp</result> </action> </package>
</struts>
<struts></struts> 是struts.xml文件的根标签,其下的标签结构为:
- <constant/> 用于定义常量,name属性为常量名,value属性为常量值。
- <include/> 用于包含其他的struts.xml配置文件,这里没有用到。
- <package></package> 用于将多个action组织成一个模块。
- <action></action> 用于注册action。name属性用来标识action,class为action所在类的位置,method指要访问action类中的方法名。
- <param></param> 参数设置。name对应Action中的bean属性名。
- <result></result> 对应Action类的返回值。name属性和返回值内容一致。
- <action></action> 用于注册action。name属性用来标识action,class为action所在类的位置,method指要访问action类中的方法名。
配置hibernate.cfg.xml
这个是Hibernate框架的核心配置文件。
实际上Hibernate框架相关的配置文件有两种:一个是核心配置文件hibernate.cfg.xml;另一个是针对每个实体类都有的一个OR映射文件xxx.hbm.xml,这个文件在之前的步骤中已经自动创建好了。
hibernate.cfg.xml主要涉及MySQL的驱动和登录,以及Hibernate的相关配置。
此文件在前面生成持久化类的时候选择创建。自动生成的配置文件已经包含了OR映射的部分,我们只需要添加MySQL的部分就可以了:
<!--MySQL驱动--> <property name="connection.url">jdbc:mysql://127.0.0.1:3306/servlet_db?serverTimezone=GMT</property> <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property> <!--MySQL的用户名和密码--> <property name="connection.username">root</property> <property name="connection.password">yourPassword</property>
配置applicationContext.xml
这个是有关spring的配置。Spring本质上是一个BeanFactory,可以按照业务逻辑的需求生产出各种JavaBean。
在本工程里涉及C3P0连接池的配置、SessionFactory的配置、各层(Action、业务逻辑、DAO)的配置。
此文件需要手动创建:在工程目录的src处右键,选择XML Configuration File下的Spring Config,然后起好名字就可以了。
创建完成之后,需要先配置一下Spring的Application Context。一般来说IDE会在页面上方自动提示,按照提示完成即可。如果没有提示,需要进入Project Structure(Ctrl+Alt+Shift+S),在Facets中的Spring里,单击加号创建新的application context,把刚才创建的xml添加进来即可,如下图。
初创建的ApplicationContext.xml文件是一个只包含一个根节点<beans></beans>的xml文件,我们需要手动向<beans></beans>中添加bean标签。
关于c3p0连接池,这里将其封装为一个JavaBean:
<!-- 数据源(C3P0连接池) --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="com.mysql.cj.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/servlet_db?serverTimezone=GMT"/> <property name="user" value="root"/> <property name="password" value="yourPassword"/> <property name="maxPoolSize" value="80"/> <property name="minPoolSize" value="1"/> <property name="initialPoolSize" value="1"/> <property name="maxIdleTime" value="20"/> </bean>
对于其他类的配置,基本格式如下:
<bean id="规定Bean的ID" class="来自于哪个类"> <property name="来自于那个类的某个属性名" ref="依赖的bean的ID"/> </bean>
Bean有以下的属性,除了class属性必须配置,其他属性都可以不配置:
- id - 在整个IoC容器中的唯一标识
- class - 实例化的Bean类
- scope - 作用域,有5种类型:
- singleton - 单例,bean容器
- prototype - 每次请求创建新的实例
- request - 每次请求创建新的实例,仅在当前request有效
- session - 每次请求创建新的实例,仅在当前sessioni有效
- global session - 这里同session
- constructor arguments - 构造器参数
- proterties - 属性,构造器注入还是设值注入
- autowriting mode - 自动装配模式
- lazy-initialization mode - 懒加载模式
- initialization/destruction method - 构造/析构方法