1、maven创建项目
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>
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.xml的bean中配置
p:prefix="/jsp/user/"p:suffix=".jsp" />
/jsp/user为jsp文件所在项目中的路径,.jsp为后缀,那么怎么找到指定的jsp页面呢?在UserController.java方法中,方法返回值即请求页面的名字。
6、 启动Tomcat,运行
启动成功后,访问http://localhost:8080/ssmdemo/index,会显示出user表中name字段的值,即项目搭建成功,继续下一步工作,请看下集。