MAVEN结构下SSH注解映射 JETTY|TOMCAT

来源:互联网 发布:c语言 strtok s 编辑:程序博客网 时间:2024/06/06 05:48

相对与mybatis,很多同学会觉得hibernate现在用的少,不好用,其实不然,实习阶段遇到很多都是基于hibernate的项目,对于其优劣性有了基础的认识,

之前忙着没什么时间,当然也是懒啊,这几天正好利用空闲时间查阅参考资料 整理搭建了一套ssh的demo 希望对初入职场的小伙伴们有所帮助

1.相信大家已经搭建好了java的开发环境了,这边不做说明(百度很多教程)

2.这个demo搭建平台为eclipse,工作中用的多,当然其他idea也可参考,下面进入搭建正题:

   首先我们需要new一个基础的maven项目

  

group id 为包名 arifact id 为项目名

搭建之后的基础结构目录如下图所示

此时java resources 下目录结构是不完整的 来 我们对其进行手动添加,右击java resources即可java resources。

对了 添加 java时可能会出现报错(为什么不深究),其实它是存在的,可以先命名为javas,新建后对其改名。

强迫症患者可以调整顺序,哈哈,我也是。

至此,一个项目结构OK了,接下来我们添加必要的文件。

首先是web.xml的配置,相关说明已打注释

<?xml version="1.0" encoding="UTF-8"?>    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"        xmlns="http://java.sun.com/xml/ns/javaee"        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"        version="3.0">        <display-name></display-name>        <!-- spring hibernate -->        <context-param>            <param-name>contextConfigLocation</param-name>            <param-value>classpath:spring.xml,classpath:spring-hibernate.xml</param-value>        </context-param>        <!-- openSessionInView配置 -->        <filter>            <filter-name>openSessionInViewFilter</filter-name>            <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>            <init-param>                <param-name>singleSession</param-name>                <param-value>true</param-value>            </init-param>        </filter>        <!--spring mvc 配置 -->        <servlet>            <servlet-name>ssh_01</servlet-name>            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>            <init-param>                <param-name>contextConfigLocation</param-name>                <param-value>classpath:spring-mvc.xml</param-value>            </init-param>            <load-on-startup>1</load-on-startup>        </servlet>            <servlet-mapping>            <servlet-name>ssh_01</servlet-name>            <url-pattern>/</url-pattern>        </servlet-mapping>                <!-- encodeing -->        <filter>            <filter-name>encodingFilter</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>            <init-param>                <param-name>forceEncoding</param-name>                <param-value>true</param-value>            </init-param>        </filter>        <!-- encoding filter for jsp page -->        <filter-mapping>            <filter-name>encodingFilter</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>    


pom.xml 选用maven的一个好处就是可以自动下载依赖包,如果下载过慢,也可以自己配置国内镜像,例如阿里巴巴的资源库
<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.ssh_01</groupId>  <artifactId>ssh_01</artifactId>  <packaging>war</packaging>  <version>0.0.1-SNAPSHOT</version>  <name>ssh_01 Maven Webapp</name>  <url>http://maven.apache.org</url>         <properties>          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>      </properties>       <dependencies>    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>3.8.1</version>      <scope>test</scope>    </dependency>         <dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope> </dependency> <!-- log4j -->          <dependency>              <groupId>log4j</groupId>              <artifactId>log4j</artifactId>              <version>1.2.17</version>          </dependency>          <!-- jstl -->          <dependency>              <groupId>javax.servlet</groupId>              <artifactId>jstl</artifactId>              <version>1.2</version>          </dependency>          <dependency>              <groupId>javax.servlet.jsp</groupId>              <artifactId>jsp-api</artifactId>              <version>2.2.1-b03</version>              <scope>provided</scope>          </dependency>           <!-- 文件上传 -->          <dependency>              <groupId>commons-fileupload</groupId>              <artifactId>commons-fileupload</artifactId>              <version>1.2.2</version>          </dependency>                    <!-- fastJson json数组有关的 -->          <dependency>              <groupId>com.alibaba</groupId>              <artifactId>fastjson</artifactId>              <version>1.1.26</version>          </dependency>           <!-- 使用 Jackson 把 Java 对象转换成 JSON 字串 -->          <dependency>              <groupId>org.codehaus.jackson</groupId>              <artifactId>jackson-mapper-asl</artifactId>              <version>1.9.11</version>          </dependency>          <!-- MySQL database driver --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.9</version></dependency><!-- druid -->          <dependency>              <groupId>com.alibaba</groupId>              <artifactId>druid</artifactId>              <version>0.2.9</version>          </dependency>                    <!-- aspectjweaver.jar这是Spring AOP所要用到的包 -->          <dependency>              <groupId>org.aspectj</groupId>              <artifactId>aspectjweaver</artifactId>              <version>1.7.1</version>          </dependency>          <!-- hibernate4 -->          <dependency>              <groupId>org.hibernate</groupId>              <artifactId>hibernate-core</artifactId>              <version>4.2.5.Final</version>          </dependency>               <dependency>              <groupId>org.hibernate</groupId>              <artifactId>hibernate-entitymanager</artifactId>              <version>4.2.5.Final</version>          </dependency>          <dependency>              <groupId>org.hibernate</groupId>              <artifactId>hibernate-ehcache</artifactId>              <version>4.2.5.Final</version>          </dependency>          <dependency>              <groupId>org.hibernate.javax.persistence</groupId>              <artifactId>hibernate-jpa-2.0-api</artifactId>              <version>1.0.1.Final</version>          </dependency>         <!-- spring mvc -->          <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-webmvc</artifactId>              <version>3.2.0.RELEASE</version>          </dependency>          <!-- spring3 -->          <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-core</artifactId>              <version>3.2.0.RELEASE</version>          </dependency>          <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-context</artifactId>              <version>3.2.0.RELEASE</version>          </dependency>          <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-jdbc</artifactId>              <version>3.2.0.RELEASE</version>          </dependency>               <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-beans</artifactId>              <version>3.2.0.RELEASE</version>          </dependency>          <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-web</artifactId>              <version>3.2.0.RELEASE</version>          </dependency>          <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-expression</artifactId>              <version>3.2.0.RELEASE</version>          </dependency>          <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-orm</artifactId>              <version>3.2.0.RELEASE</version>          </dependency>          <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-test</artifactId>              <version>3.2.0.RELEASE</version>          </dependency>    </dependencies>   <build>    <plugins>   <plugin>      <groupId>org.mortbay.jetty</groupId>      <artifactId>maven-jetty-plugin</artifactId>      <version>6.1.26</version>      <configuration>                       <scanIntervalSeconds>3</scanIntervalSeconds>          <connectors>              <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">                  <port>8888</port>              </connector>          </connectors>                             <scanTargetPatterns>              <scanTargetPattern>                  <directory>src/main/webapp/WEB-INF</directory>                  <excludes>                             <exclude>**/*.jsp</exclude>                  </excludes>                  <includes>                      <include>**/*.properties</include>                      <include>**/*.xml</include>                  </includes>              </scanTargetPattern>          </scanTargetPatterns>      </configuration>  </plugin><!-- <plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>8888</port><path>/ssh_01</path><uriEncoding>UTF-8</uriEncoding><finalName>mgr</finalName><server>tomcat7</server></configuration></plugin> --></plugins>    <finalName>ssh_01</finalName>  </build></project>

在resources下我们需要简历如下几个文件


config.properties为数据库配置信息

#mysqlhibernate.dialect=org.hibernate.dialect.MySQLDialecthibernate.hbm2ddl.auto=update hibernate.show_sql=truehibernate.format_sql=truesessionInfoName=sessionInfo  uploadFieldName=filedatauploadFileMaxSize=20971520uploadFileExts=txt,rar,zip,doc,docx,xls,xlsx,jpg,jpeg,gif,png,swf,wmv,avi,wma,mp3,mid uploadDirectory=attached  validationQuery=SELECT 1  jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characterEncoding=gbkjdbc.username=rootjdbc.password=root
log4j.properties是日志记录,file会在项目根目录下生成日志文件

log4j.rootLogger=INFO,A1,R    log4j.appender.A1=org.apache.log4j.ConsoleAppender  log4j.appender.A1.Target=System.out  log4j.appender.A1.layout=org.apache.log4j.PatternLayout  log4j.appender.A1.layout.ConversionPattern=[%c]%m%n    log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=run.log  log4j.appender.R.MaxFileSize=10MB  log4j.appender.R.Threshold=ALL  log4j.appender.R.layout=org.apache.log4j.PatternLayout  log4j.appender.R.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n 
spring-hibernate.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:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="    http://www.springframework.org/schema/beans     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd     http://www.springframework.org/schema/tx     http://www.springframework.org/schema/tx/spring-tx-3.0.xsd    http://www.springframework.org/schema/aop     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd    ">                      <!-- 配置数据源 -->        <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">            <property name="driverClassName" value="${jdbc.driver}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" />            <!-- 初始化连接大小 -->            <property name="initialSize" value="0" />            <!-- 连接池最大使用连接数量 -->            <property name="maxActive" value="20" />            <!-- 连接池最大空闲 -->            <property name="maxIdle" value="20" />            <!-- 连接池最小空闲 -->            <property name="minIdle" value="0" />            <!-- 获取连接最大等待时间 -->            <property name="maxWait" value="60000" />                <!-- <property name="poolPreparedStatements" value="true" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="33" /> -->                <property name="validationQuery" value="${validationQuery}" />            <property name="testOnBorrow" value="false" />            <property name="testOnReturn" value="false" />            <property name="testWhileIdle" value="true" />                <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->            <property name="timeBetweenEvictionRunsMillis" value="60000" />            <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->            <property name="minEvictableIdleTimeMillis" value="25200000" />                <!-- 打开removeAbandoned功能 -->            <property name="removeAbandoned" value="true" />            <!-- 1800秒,也就是30分钟 -->            <property name="removeAbandonedTimeout" value="1800" />            <!-- 关闭abanded连接时输出错误日志 -->            <property name="logAbandoned" value="true" />                <!-- 监控数据库 -->            <!-- <property name="filters" value="stat" /> -->            <property name="filters" value="mergeStat" />        </bean>            <!-- 配置hibernate session工厂 -->       <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="hibernateProperties"><props><prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop><prop key="hibernate.show_sql">true</prop><prop key="hibernate.format_sql">true</prop><prop key="hibernate.hbm2ddl.auto">update</prop><prop key="hibernate.jdbc.batch_size">50</prop><prop key="hibernate.autoReconnect">true</prop> <!-- <prop key="hibernate.current_session_context_class">thread</prop>  --><prop key="hibernate.transaction.auto_close_session">false</prop><prop key="hibernate.connection.release_mode">after_transaction</prop> <prop key="current_session_context_class">thread</prop></props></property><property name="packagesToScan" value="com.gyj.model"/></bean>        <!-- 配置事务管理器 -->        <bean name="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">            <property name="sessionFactory" ref="sessionFactory"></property>        </bean>            <!-- 注解方式配置事物 -->        <!-- <tx:annotation-driven transaction-manager="transactionManager" /> -->            <!-- 拦截器方式配置事物 -->        <tx:advice id="transactionAdvice" transaction-manager="transactionManager">            <tx:attributes>                <tx:method name="add*" />                <tx:method name="save*" />                <tx:method name="update*" />                <tx:method name="modify*" />                <tx:method name="edit*" />                <tx:method name="delete*" />                <tx:method name="remove*" />                <tx:method name="repair" />                <tx:method name="deleteAndRepair" />                    <tx:method name="get*" propagation="SUPPORTS" />                <tx:method name="find*" propagation="SUPPORTS" />                <tx:method name="load*" propagation="SUPPORTS" />                <tx:method name="search*" propagation="SUPPORTS" />                <tx:method name="datagrid*" propagation="SUPPORTS" />                            <tx:method name="*" propagation="SUPPORTS" />            </tx:attributes>        </tx:advice>        <aop:config>            <aop:pointcut id="transactionPointcut" expression="execution(* com.gyj.service..*impl.*(..))" />            <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" />        </aop:config>            </beans>  

spring-mvc.xml,很多同学在配置的时候会发现静态资源加载不进去,在此我做了简单测试,古老的方法是控制层采用.do或者.action的后缀方法去识别,未免觉得不好,所以我们去掉后缀之后,必须在xml配置静态资源的加载,否则会被系统过滤。

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"        xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"        xmlns:mvc="http://www.springframework.org/schema/mvc" 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            http://www.springframework.org/schema/context            http://www.springframework.org/schema/context/spring-context-3.1.xsd            http://www.springframework.org/schema/mvc            http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">           <!-- 静态文件夹 --><mvc:resources location="/static/" mapping="/static/**"/>         <!-- 注解扫描包 -->        <context:component-scan base-package="com.gyj.controller" />        <!-- 开启mvc注解 -->        <mvc:annotation-driven />            <bean id="viewResolver"            class="org.springframework.web.servlet.view.InternalResourceViewResolver">            <property name="prefix" value="/WEB-INF/"></property>            <property name="suffix" value=".jsp"></property>        </bean>            <!-- 静态资源映射 --><mvc:resources mapping="/static/**" location="/"/></beans>    

spring.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" 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    ">            <!-- 引入属性文件 -->        <context:property-placeholder location="classpath:config.properties" />               <!-- 自动扫描dao和service包(自动注入) -->        <context:component-scan base-package="com.gyj.dao" />        <context:component-scan base-package="com.gyj.service" />        </beans>  

然后我们在此目录下书写一些demo程序


User.java

package com.gyj.model;import java.io.Serializable;  import javax.persistence.Column;  import javax.persistence.GeneratedValue;  import javax.persistence.Id;    import org.hibernate.annotations.AccessType;  import org.hibernate.annotations.GenericGenerator;    @javax.persistence.Entity  @javax.persistence.Table(name = "User")  @AccessType("field")  public class User implements Serializable{    private static final long serialVersionUID = 1L;    /**  * 用户ID */  @Id  @Column(name = "ID", length = 32)  @GeneratedValue(generator = "uuid")    @GenericGenerator(name = "uuid", strategy = "uuid")    private String id;  /**  * 用户名 */  @Column(name = "NAME", length = 10)  private String name;/** * 用户密码 */@Column(name = "PASSWORD", length = 10)  private String password;  public String getId(){      return this.id;  }  public void setId(String id){      this.id=id;  }  public String getName(){      return this.name;  }   public void setName(String name){      this.name=name;  }public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}    }  

UserDao.java

package com.gyj.dao;import java.util.List;  import org.hibernate.Query;  import org.hibernate.Session;  import org.hibernate.SessionFactory;  import org.hibernate.Transaction;  import org.springframework.beans.factory.annotation.Autowired;  import org.springframework.stereotype.Repository;  import org.springframework.transaction.annotation.Transactional;import com.gyj.model.User;      @Repository  public class UserDao {            @Autowired       private SessionFactory sessionFactory;              /**      *       * 获取用户 List      */      public List<User> getuserList(){                    Session session = sessionFactory.openSession();          String hql = "from User";                Query query = session.createQuery(hql);                List<User> userList = query.list();           session.close();          return userList;      }                  /**      *       * 根据id删除用户       */      public void deleteUser(String userId){          Session session = sessionFactory.openSession();          String hql = "delete from User where id = ? ";          Query query =  session.createQuery(hql);          query.setString(0, userId);          query.executeUpdate();          session.close();                }            /**      *       * 保存用户      */      @Transactional      public void saveOrUpdate(User user,String userId){                    if(!"".equals(userId)&&null!=userId){              user.setId(userId);          }          Session session = sessionFactory.openSession();          Transaction tx = session.beginTransaction();          session.saveOrUpdate(user);          tx.commit();      }            /**      * 获取用户      */      public User getUser(String userId){          Session session = sessionFactory.openSession();          return (User) session.get(User.class, userId);      }                    }  

UserService.java

package com.gyj.service;import java.util.List;import com.gyj.model.User;    public interface UserService {            public List<User> getUserList();            public void deleteUser(String userId);            public void saveOrUpdateUser(User user,String userId);            public User getUser(String userId);          }  
UserServiceImpl.java 业务层接口实现

package com.gyj.service.impl;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Repository;import com.gyj.dao.UserDao;import com.gyj.model.User;import com.gyj.service.UserService;@Repositorypublic class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;@Overridepublic List<User> getUserList() {return userDao.getuserList();}@Overridepublic void deleteUser(String userId) {userDao.deleteUser(userId);}@Overridepublic User getUser(String userId) {return userDao.getUser(userId);}@Overridepublic void saveOrUpdateUser(User user, String userId) {userDao.saveOrUpdate(user, userId);}}

controller代码

package com.gyj.controller;import java.util.List;  import org.springframework.beans.factory.annotation.Autowired;  import org.springframework.stereotype.Controller;  import org.springframework.ui.Model;  import org.springframework.web.bind.annotation.RequestMapping;import com.gyj.model.User;import com.gyj.service.UserService;    @Controller  public class UserController {            @Autowired      private UserService service;            /**       * 获取用户列表       */      @RequestMapping("/getUserList")      public String getUserList(Model model){          List<User> userlist = service.getUserList();          model.addAttribute("userlist", userlist);            return "UserList";      }            /**       * 根据id删除用户       */      @RequestMapping("/deleteUser")      public String deleteUser(String userId){                  service.deleteUser(userId);          return "redirect:/getUserList";      }            /**       *        * 新增 编辑用户       */      @RequestMapping("/addOreditUser")      public String toAddUserPage(String userId,Model model){               User user = new User();                   if(!"".equals(userId)&&null!=userId){          user =  service.getUser(userId);          }else{          user = null;          }          model.addAttribute("user", user);          return "addUserPage";      }            /**       *保存用户      */      @RequestMapping("/saveOrupdateUser")      public String saveOrUpdateUser(User user,String userId){          service.saveOrUpdateUser(user,userId);          return "redirect:/getUserList";      }  }  

至此,框架已搭建完成,初始jdk可能默认1.5,同学们自行设置




在pom.xml我进行了jetty和tomcat的两中配置

jetty示例访问:

为什么要配置两种访问方式?

Jetty更轻量级。这是相对Tomcat而言的。具体就不阐述了,哈哈,我也是小白。

本文结束,亲测可行,希望对大家的工作学习之路有所帮助。

这是git源码地址:https://git.oschina.net/gaoyaojun/ssh.git

原创粉丝点击