maven+Intelij搭建SSH框架

来源:互联网 发布:刀塔传奇 源码 编辑:程序博客网 时间:2024/06/06 02:07

前言: 最近在学习SSH框架,发现网络上大部分教程都是针对Eclipse的,依赖管理也是用传统的方法来管理,而SSH框架经常会出现各种兼容性的问题,要反复的删除和替换依赖包,这些工作极大地耗费时间,难怪大神们发明了maven工具来管理依赖,确实方便了很多。好了,闲话少说,进入正题。

1. 创建maven工程
这里写图片描述
2.填写GroupID
这里写图片描述
3.确定存储jar包的maven库
图中是我自己的maven仓库的路径,如果对maven的设置有不清楚的同学可以参照maven的设置
这里写图片描述
4.完成创建
这里写图片描述
5.最终完成以后的项目结构
注意其中的struts.xml、applicationContext.xml和web.xml的放置路径,如果路径放置不正确,会导致项目报错

这里写图片描述
6.创建package
在src/main文件下新建java文件夹,然后右击,选择“Mark Directory as“->”Sources Root”, 此时java文件夹应该变成蓝色,否则只能创建directory而不是Package。然后再右击java文件夹,创建package,取名为ssh.action,类似的方法创建其余的包。

7.最重要的pom.xml
请注意其中的注释,尤其是build部分!

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>com</groupId>  <artifactId>SSH_P</artifactId>  <packaging>war</packaging>  <version>1.0-SNAPSHOT</version>  <name>SSH_P Maven Webapp</name>  <url>http://maven.apache.org</url>  <!--可以将spring、struts、hibernate的版本号写在property中,方便后面改动-->  <properties>    <spring.version>4.2.4.RELEASE</spring.version>  </properties>  <dependencies>    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>4.10</version>      <scope>test</scope>    </dependency>    <!-- 添加SSH依赖 -->    <!-- Struts2 -->    <dependency>      <groupId>org.apache.struts</groupId>      <artifactId>struts2-core</artifactId>      <version>2.3.24</version>    </dependency>    <dependency>      <groupId>org.apache.struts</groupId>      <artifactId>struts2-spring-plugin</artifactId>      <version>2.3.24.1</version>    </dependency>    <!-- 添加Hibernate依赖 -->    <dependency>      <groupId>org.hibernate</groupId>      <artifactId>hibernate-core</artifactId>      <version>3.6.10.Final</version>    </dependency>    <!-- spring框架依赖 -->    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-core</artifactId>      <version>${spring.version}</version>    </dependency>    <!-- 包含了大量注解@Autowired等。 -->    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-beans</artifactId>      <version>${spring.version}</version>    </dependency>    <!-- 包含SessionFactory org.springframework.orm.hibernate4.LocalSessionFactoryBean -->    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-orm</artifactId>      <version>${spring.version}</version>    </dependency>    <!-- 包含ContextLoaderListener 监听器 -->    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-web</artifactId>      <version>${spring.version}</version>    </dependency>    <!--  ApplicationContextInitializer -->    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-context</artifactId>      <version>${spring.version}</version>    </dependency>    <!-- mysql驱动 -->    <dependency>      <groupId>mysql</groupId>      <artifactId>mysql-connector-java</artifactId>      <version>5.1.26</version>    </dependency>    <!-- c3p0数据源 -->    <dependency>      <groupId>c3p0</groupId>      <artifactId>c3p0</artifactId>      <version>0.9.1.2</version>    </dependency>    <dependency>      <groupId>commons-dbcp</groupId>      <artifactId>commons-dbcp</artifactId>      <version>1.4</version>    </dependency>    <!-- 添加Log4J依赖 -->    <dependency>      <groupId>log4j</groupId>      <artifactId>log4j</artifactId>      <version>1.2.16</version>    </dependency>    <dependency>      <groupId>org.slf4j</groupId>      <artifactId>slf4j-api</artifactId>      <version>1.6.1</version>    </dependency>    <dependency>      <groupId>org.slf4j</groupId>      <artifactId>slf4j-nop</artifactId>      <version>1.6.4</version>    </dependency>    <!-- 添加javassist -->    <dependency>      <groupId>javassist</groupId>      <artifactId>javassist</artifactId>      <version>3.11.0.GA</version>    </dependency>  </dependencies>  <build>    <finalName>SSH_P</finalName>    <resources>      <resource>        <directory>src/main/java</directory>        <includes>          <!--如果不加这行代码,在ssh.beans文件夹下的User.hbm.xml文件就不会被maven拷贝到target下的classes文件夹,就会出现classNotFound的错误;并且必须写成"**/*.xml",写成"*/*.xml"也一样报错-->          <include>**/*.xml</include>        </includes>        <filtering>true</filtering>      </resource>    </resources>  </build></project>

8.创建ssh.action.Register类
Register.java通过struts.xml中的action来连接Register.jsp, 用来响应用户输入,并将接收到的内容传递给UserManagerImpl来处理,代码如下所示:

package ssh.action;import com.opensymphony.xwork2.ActionSupport;import ssh.serviceImpl.UserManagerImpl;import ssh.vo.UserForm;public class Register extends ActionSupport {//这里userForm的名字必须与Register.jsp中的对应    private UserForm userForm;    private UserManagerImpl userManager;    public UserForm getUserForm() {        return userForm;    }    public void setUserForm(UserForm userForm) {        this.userForm = userForm;    }    public void setUserManager(UserManagerImpl userManager) {        this.userManager = userManager;    }    public String execute() {        try {            userManager.regUser(userForm);            return SUCCESS;        } catch (Exception e) {            e.printStackTrace();            return ERROR;        }    }}

9.创建ssh.beans.User类
User.java对应数据库的表格,代码如下所示:

package ssh.beans;public class User {    private String userName;    private String password;    private int gender;    private int userId;    public void setUserId(int userId) {        this.userId = userId;    }    public int getUserId() {        return userId;    }    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    public int getGender() {        return gender;    }    public void setGender(int gender) {        this.gender = gender;    }}

10. 创建ssh/beans/User.hbm.xml文件
User.hbm.xml文件将User类与数据库字段一一对应,代码如下:

<?xml version="1.0" encoding="utf-8" ?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="ssh.beans">    <class name="User" table="user">        <id name="userId" column="userId">            <generator class="native"/>        </id>        <property name="userName" type="java.lang.String" column="userName" length="16" not-null="true"/>        <property name="gender" type="java.lang.Integer" column="gender" length="1" not-null="true"/>        <property name="password" type="java.lang.String" length="16" not-null="true"/>    </class></hibernate-mapping>

11. 创建ssh.dao.BaseDao接口
BaseDao接口定义了与数据库的交互方法

package ssh.dao;public interface BaseDao {    void save(Object obj);}

12. 创建ssh.daoImpl.UserDao类
UserDao类定义交互方法的具体实现,其中的getHibernateTemplate方法只适用于hibernate3,对于hibernate4,需要用其他方法实现,请自行查阅。

package ssh.daoImpl;import ssh.dao.BaseDao;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;public class UserDao extends HibernateDaoSupport implements BaseDao {    public void save(Object obj) {        getHibernateTemplate().save(obj);    }}

13. 创建ssh.service.UserManager接口
UserManager接口指明了业务层需要进行的操作

package ssh.service;import ssh.vo.UserForm;public interface UserManager {    void regUser(UserForm userForm);}

14. 创建ssh.serviceImpl.UserManagerImpl类
UserManagerImpl类详细定义了业务层的实现方法

package ssh.serviceImpl;import ssh.beans.User;import ssh.daoImpl.UserDao;import ssh.service.UserManager;import ssh.vo.UserForm;import org.springframework.beans.BeanUtils;public class UserManagerImpl implements UserManager {  private UserDao baseDao;    public void regUser(UserForm userForm) {      User user=new User();      BeanUtils.copyProperties(userForm,user);      baseDao.save(user);    }  public void setBaseDao(UserDao baseDao) {      this.baseDao=baseDao;  }}

15. 创建ssh.vo.UserForm类
UserForm类通过Register.java与Register.jsp产生关联,接收用户输入,它与User类的区别在于User类多了UserId字段

package ssh.vo;public class UserForm {    private String userName;    private String password;    private int gender;    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    public int getGender() {        return gender;    }    public void setGender(int gender) {        this.gender = gender;    }}

16. 编写applicationContext.xml文件
applicationContext.xml文件放置在webapp\WEB-INF文件夹下,是spring框架的配置文件,在其中定义了数据库的连接,以及各个bean的创建和装配细节

<?xml version="1.0" encoding="utf-8" ?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://www.springframework.org/schema/beans           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">        <property name="driverClass">            <value>com.mysql.jdbc.Driver</value>        </property>        <property name="jdbcUrl">            <value>jdbc:mysql://localhost/test</value>        </property>        <property name="user">            <value>root</value>        </property>        <property name="password">            <value>123Abcde</value>        </property>        <property name="maxPoolSize">            <value>80</value>        </property>        <property name="minPoolSize">            <value>1</value>        </property>        <property name="initialPoolSize">            <value>1</value>        </property>        <property name="maxIdleTime">            <value>20</value>        </property>    </bean>    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">        <property name="dataSource">            <ref local="dataSource" />        </property>        <property name="mappingResources">            <list>                <value>ssh/beans/User.hbm.xml</value>            </list>        </property>        <property name="hibernateProperties">            <props>                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>                <prop key="show_sql">true</prop>                <prop key="hibernate.jdbc.batch_size">20</prop>            </props>        </property>    </bean>    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">        <property name="sessionFactory" ref="sessionFactory"/>    </bean>    <bean id="dao" class="ssh.daoImpl.UserDao">        <property name="sessionFactory" ref="sessionFactory"/>    </bean>    <bean id="userManager" class="ssh.serviceImpl.UserManagerImpl">        <property name="baseDao">            <ref bean="dao"/>        </property>    </bean>    <bean id="regAction"  class="ssh.action.Register">        <property name="userManager">            <ref bean="userManager" />        </property>    </bean></beans>

创建完成以后,打开project Structure,为spring模块添加文件,如下图所示:
这里写图片描述
17. 创建struts.xml文件
struts.xml是连接jsp文件和java文件的配置文件,放置在resources文件夹下,其中“register”连接的是Register.jsp,“regAction”连接的是ssh.action.Regtister.java

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"        "http://struts.apache.org/dtds/struts-2.0.dtd"><struts>    <!--namespace="/"-->    <!--当把struts.xml放在src文件夹下而不是resources文件夹中的时候,会出现以下报错(即便在name="ssh"之后加上namespace="/"也不行)-->    <!--“There is no Action mapped for namespace [/] and action name [register] associated with context path [/SSH].”-->    <include file="struts-default.xml"/>    <package name="ssh" extends="struts-default">        <action name="register" class="regAction">            <!--既可以写成"/Register.jsp",也可以写成"Register.jsp"-->            <result name="input">/Register.jsp</result>            <result name="success">/Success.jsp</result>            <result name="error">/Fail.jsp</result>        </action>    </package></struts>

编写完成以后,打开project Structure,为struts2模块添加文件,如下图所示:
这里写图片描述
18. 修改web.xml文件

<!DOCTYPE web-app PUBLIC        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"        "http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app>   <filter>    <filter-name>SSH</filter-name>    <filter-class>      org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter    </filter-class>  </filter>  <filter-mapping>    <filter-name>SSH</filter-name>    <url-pattern>/*</url-pattern>  </filter-mapping>  <listener>    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  </listener>  <welcome-file-list>    <welcome-file>index.jsp</welcome-file>  </welcome-file-list></web-app>

19. 创建Register.jsp
注意其中的注释!
另外,Success.jsp 和Fail.jsp也是和Register.jsp一样,放置在webapp路径下,内容比较简单,就是输出一句话,代码就不放出来了。

<%@ page language="java" contentType="text/html; charset=UTF-8"         pageEncoding="UTF-8"%><%@ taglib prefix="s" uri="/struts-tags"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head>    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">    <title>User Register Page</title></head><body><s:form action="register">    <%--注意:这里的"userForm.userName"是与Register.java中的userForm挂起来的,通过Register.jsp,将用户输入传递给userForm,然后再通过userManagerImpl将userForm的内容拷贝给user,再由baseDao进行存储--%>    <s:textfield name="userForm.userName" label="用户名"></s:textfield>    <s:password name="userForm.password" label="密码"></s:password>    <s:select list="#{'1':'男','0':'女'}" listKey="key" listValue="value"              name="userForm.gender" label="性别" value="1"></s:select>    <s:submit value="注册"></s:submit></s:form></body></html>

20. 配置tomcat
打开配置界面
打开配置界面
添加Tomcat
添加Tomcat
配置启动端口
注意:之前碰到过一个问题,就是讲项目热部署以后,改动jsp文件并不会动态更新页面,后来发现需要在下图中“on Update action”的选项中选择“Update classes and resources”!
配置启动端口
这里写图片描述

完成以后,就可以启动测试了。当然不要忘了添加数据库test和数据表user,本项目中用的是mysql,创建user表的sql语句如下:

create table user(  userId int auto_increment,  userName varchar(16) not null,  password varchar(16) not null,  gender int not null,  primary key(userId)  );  

总结:
首先申明,本项目也是参照网络上的教程来的,但是我使用的是intellij,原文用的是eclipse,依赖管理也没有使用maven,费时费力,搞得头晕脑胀,有时候还会碰到一些依赖包的版本不兼容的问题,又得更换jar包,非常麻烦,所以我决定用maven来实现这个项目,才有了这样一篇文章。在此也对原文作者表示感谢!(使用eclipse的同学请点击这里)

另外,由于我也是新手,也是踩了很多坑才把这个项目搭建成功,在Project structrue的设置过程中,有一些步骤可能没有截图截得那么详细,请见谅!不过我自己的项目是可以成功运行的,需要的同学请前往这里 下载!

这个学习过程的最大感受:纸上得来终觉浅,绝知此事要躬行!一定要自己动手才能了解其中的细节~

0 0
原创粉丝点击