Maven创建SSM项目

本文通过Maven创建了一个SSM(Spring、Spring MVC、Mybatis)项目,详细介绍了从设置基本目录结构到配置web.xml、dispatcher-servlet.xml、数据库连接等步骤。在项目中,还展示了如何使用Mybatis进行自动代码生成,并解释了访问路径的拼装逻辑。最终,通过启动Tomcat并访问特定URL验证项目成功搭建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、maven创建项目

参考Maven创建WEB项目

2、 项目的基本目录是这样婶的:


3、spring注解方式搭建最简单项目框架

几个重要的配置文件:

web.xml

applicationContext.xml Spring的配置文件

jdbc.properties数据库配置文件

log4j.properties日志配置文件

dispatcher-servlet.xml spring MVC配置文件

下面给出几个配置文件的详细代码

web.xml:此文件装载spring、spring MVC、log4j及spring监听器、乱码处理

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	
  <!-- Spring context startup Spring的初始化--> 
    <context-param> 
        <param-name>contextConfigLocation</param-name> 
        <param-value><!-- Spring的配置文件 --> 
        classpath:applicationContext.xml 
        </param-value> 
    </context-param> 
    <listener> 
        <listener-class> 
        org.springframework.web.context.ContextLoaderListener 
        </listener-class> 
    </listener>
    <!-- 防止Spring内存溢出监听器 -->
    <listener>    <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
    </listener>
    <!-- Spring character filter 处理乱码--> 
    <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> 
    </filter> 
    <filter-mapping> 
        <filter-name>encodingFilter</filter-name> 
        <url-pattern>/*</url-pattern> 
    </filter-mapping>
    <!-- Configuration of Log4j log4j的配置 --> 
    <context-param> 
        <param-name>log4jConfigLocation</param-name> 
        <param-value><!-- log4j.properties文件路径 --> 
        classpath:log4j.properties 
        </param-value> 
    </context-param> 
    <context-param> 
        <param-name>log4jRefreshInterval</param-name> 
        <param-value>60000</param-value> 
    </context-param> 
    <listener> 
        <listener-class> 
        org.springframework.web.util.Log4jConfigListener 
        </listener-class> 
    </listener>
    <!-- Spring MVC Configuration Spring MVC的配置--> 
    <servlet> 
        <servlet-name>dispatcher</servlet-name> 
        <servlet-class> 
        org.springframework.web.servlet.DispatcherServlet 
        </servlet-class> 
        <init-param> 
           <param-name>contextConfigLocation</param-name> 
           <param-value><!-- dispatcher-servlet.xml文件路径 --> 
           classpath:dispatcher-servlet.xml 
           </param-value> 
          </init-param> 
        <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
        <servlet-name>dispatcher</servlet-name> 
        <url-pattern>/</url-pattern> 
    </servlet-mapping>
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
jdbc.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
user=root
password=root
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:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-2.5.xsd 
http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> 

    <!-- jdbc.properties文件路径  --> 
    <bean       class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
        <property name="locations" value="classpath:jdbc.properties" /> 
    </bean> 
    
    <!-- 数据源的配置 --> 
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
        <property name="driverClassName" value="${driver}" /> 
        <property name="url" value="${url}" /> 
        <property name="username" value="${user}" /> 
        <property name="password" value="${password}" /> 
        <!-- data source configuration --> 
        <property name="initialSize" value="60" /><!-- initial connections --> 
        <property name="maxActive" value="100" /><!-- MAX connections --> 
        <property name="maxIdle" value="50" /><!-- MAX idle connections --> 
        <property name="minIdle" value="10" /><!-- MIN idle connections --> 
        <!-- 处理mysql 8小时自动断开连接的问题 --> 
        <property name="testWhileIdle" value="true" /> 
        <property name="testOnBorrow" value="false" /> 
        <property name="testOnReturn" value="false" /> 
        <property name="validationQuery" value="select 1" /> 
        <property name="timeBetweenEvictionRunsMillis" value="20000" /> 
        <property name="numTestsPerEvictionRun" value="100" /> 
    </bean> 
    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
    <!-- 配置事务管理器 -->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <tx:annotation-driven transaction-manager="txManager" />
	
	<!-- mybatis.spring自动映射 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.mycompany.web.entity.mapping"/>
    </bean>

    <!-- 自动扫描,多个包以逗号分隔,让Bean定义注解工作起来-->
    <context:component-scan base-package="com.mycompany.web"/>
    <aop:aspectj-autoproxy proxy-target-class="true"/>
</beans> 


dispatcher-servlet.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    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.0.xsd 
http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

    <context:annotation-config /> 
    <!-- 把标记了@Controller注解的类转换为bean,application中context:component-scan配置不能取代此处,会报错404 --> 
    <context:component-scan base-package="com.mycompany.web.controller" />
    <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 --> 
    <bean 
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> 
    <!-- 视图 beans --> 
    <bean id="viewResolver"  class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
        p:prefix="/jsp/user/" p:suffix=".jsp" /> 
        <!-- Controller 跳转的JSP页面路径 和 文件的后缀 --> 
</beans>

4、  Mybatis自动代码生成

5、 首先完成工作,然后更好的去理解工作,继续贴代码,以user为例

UserDaoImpl.java

package com.mycompany.web.dao.impl;

import javax.annotation.Resource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.stereotype.Repository;
import com.mycompany.web.dao.IUserDao;
import com.mycompany.web.entity.User;

@Repository
public class UserDaoImpl extends SqlSessionDaoSupport implements IUserDao {
	
	@Resource  
    public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory){  
        super.setSqlSessionFactory(sqlSessionFactory);  
    }  

	public int deleteByPrimaryKey(Long id) {
		return this.getSqlSession().delete("deleteByPrimaryKey", id);
	}

	public int insert(User record) {
		return this.getSqlSession().insert("insert", record);
	}

	public int insertSelective(User record) {
		return this.getSqlSession().insert("insertSelective", record);
	}

	public User selectByPrimaryKey(Long id) {
		return this.getSqlSession().selectOne("selectByPrimaryKey", id);
	}

	public int updateByPrimaryKey(User record) {
		return this.getSqlSession().update("updateByPrimaryKey", record);
	}

	public int updateByPrimaryKeySelective(User record) {
		return this.getSqlSession().update("updateByPrimaryKeySelective", record);
	}
}
UserServiceImpl.java

package com.mycompany.web.service.impl;

import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.mycompany.web.dao.IUserDao;
import com.mycompany.web.entity.User;
import com.mycompany.web.service.IUserService;

@Transactional
@Service("userService")
public class UserServiceImpl implements IUserService{
	
	@Resource
	private IUserDao userDaoImpl;	
	
	@Override
	public User getUserById(Long id){
		return this.userDaoImpl.selectByPrimaryKey(id);
	}
	
	@Override
	public void insertUser(List<User> userList){
		for(int i=0;i<userList.size();i++){
			if(i<10){
				this.userDaoImpl.insertSelective(userList.get(i));
			}else{
				throw new RuntimeException();
			}
		}
	}
}
UserController.java

package com.mycompany.web.controller;

import javax.annotation.Resource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.mycompany.web.entity.User;
import com.mycompany.web.service.IUserService;

@Controller
public class UserController {
	
	public static Log log = LogFactory.getLog(UserController.class); 

	@Resource
	private IUserService userService;
	
	@RequestMapping("/index")
    public String getUserById(Model model){
	    User user = userService.getUserById(1L);
	    model.addAttribute("user", user);
	    log.info("---------"+user.getName()+"-------】");
        return "MyJsp";
    }
}
UserMapper.java

不太清楚为什么要有这个类

package com.mycompany.web.entity.mapping;

import org.apache.ibatis.annotations.Param;

import com.mycompany.web.entity.User;

public interface UserMapper {
    public User selectByPrimaryKey(@Param("id") Long id);
}

UserMapper.xml

都是利用mybatis代码生成器自动生成的代码,只要修正namespace及type即可

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.mycompany.web.entity.mapping.UserMapper" >
  <resultMap id="BaseResultMap" type="com.mycompany.web.entity.User" >
    <id column="id" property="id" jdbcType="BIGINT" />
    <result column="name" property="name" jdbcType="VARCHAR" />
    <result column="idcard" property="idcard" jdbcType="VARCHAR" />
    <result column="gender" property="gender" jdbcType="CHAR" />
    <result column="age" property="age" jdbcType="INTEGER" />
  </resultMap>
  <sql id="Base_Column_List" >
    id, name, idcard, gender, age
  </sql>
  <!-- 根据主键ID查找指定数据-单条 -->
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >
    select 
    <include refid="Base_Column_List" />
    from user_info
    where id = #{id,jdbcType=BIGINT}
  </select>
  <!-- 根据主键ID删除指定数据-单条 -->
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long" >
    delete from user_info
    where id = #{id,jdbcType=BIGINT}
  </delete>
  <!-- 插入一条数据 -->
  <insert id="insert" parameterType="com.mycompany.web.entity.User" >
    insert into user_info (id, name, idcard, gender, age)
    values (#{id,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{idcard,jdbcType=VARCHAR}, 
      		#{gender,jdbcType=CHAR}, #{age,jdbcType=INTEGER})
  </insert>
  <!-- 指定字段插入 -->
  <insert id="insertSelective" parameterType="com.mycompany.web.entity.User" >
    insert into user_info
    <trim prefix="(" suffix=")" suffixOverrides="," >
      <if test="id != null" >
        id,
      </if>
      <if test="name != null" >
        name,
      </if>
      <if test="idcard != null" >
        idcard,
      </if>
      <if test="gender != null" >
        gender,
      </if>
      <if test="age != null" >
        age,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
      <if test="id != null" >
        #{id,jdbcType=BIGINT},
      </if>
      <if test="name != null" >
        #{name,jdbcType=VARCHAR},
      </if>
      <if test="idcard != null" >
        #{idcard,jdbcType=VARCHAR},
      </if>
      <if test="gender != null" >
        #{gender,jdbcType=CHAR},
      </if>
      <if test="age != null" >
        #{age,jdbcType=INTEGER},
      </if>
    </trim>
  </insert>
  <!-- 指定字段修改 -->
  <update id="updateByPrimaryKeySelective" parameterType="com.mycompany.web.entity.User" >
    update user_info
    <set >
      <if test="name != null" >
        name = #{name,jdbcType=VARCHAR},
      </if>
      <if test="idcard != null" >
        idcard = #{idcard,jdbcType=VARCHAR},
      </if>
      <if test="gender != null" >
        gender = #{gender,jdbcType=CHAR},
      </if>
      <if test="age != null" >
        age = #{age,jdbcType=INTEGER},
      </if>
    </set>
    where id = #{id,jdbcType=BIGINT}
  </update>
  <!-- 根据主键ID更新 -->
  <update id="updateByPrimaryKey" parameterType="com.mycompany.web.entity.User" >
    update user_info
    set name = #{name,jdbcType=VARCHAR},
     	idcard = #{idcard,jdbcType=VARCHAR},
      	gender = #{gender,jdbcType=CHAR},
      	age = #{age,jdbcType=INTEGER}
    where id = #{id,jdbcType=BIGINT}
  </update>
</mapper>

简单说明一下访问页面路径的拼装:

比如访问路径为http://localhost:8080/ssmdemo/index

ssmdemo为项目名,/index及对应要访问的页面,那么页面在哪里对应的这个访问路径呢?在dispatcher-sevlet.xmlbean中配置

p:prefix="/jsp/user/"p:suffix=".jsp" />

/jsp/userjsp文件所在项目中的路径,.jsp为后缀,那么怎么找到指定的jsp页面呢?在UserController.java方法中,方法返回值即请求页面的名字。

6、 启动Tomcat,运行

启动成功后,访问http://localhost:8080/ssmdemo/index,会显示出user表中name字段的值,即项目搭建成功,继续下一步工作,请看下集。











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值