0%

SSm基础知识

1 springMVC

原理

62o0Jg.png

特点

  • 它是基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对象之类的都是java组件.并且和Spring提供的其他基础结构紧密集成.
  • 不依赖于Servlet API(目标虽是如此,但是在实现的时候确实是依赖于Servlet的)
  • 可以任意使用各种视图技术,而不仅仅局限于JSP
  • 支持各种请求资源的映射策略
  • 它应是易于扩展的

工作流程

  1. 用户发送请求至前端控制器DispatcherServlet
  2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。
  3. 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
  4. DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
  5. 执行处理器(Controller,也叫后端控制器)。
  6. Controller执行完成返回ModelAndView
  7. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
  8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器
  9. ViewReslover解析后返回具体View
  10. DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
  11. DispatcherServlet响应用户

springMVC与struts的区别

  1. springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。
  2. springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
  3. Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。

2 SSM,优缺点,使用场景

  1. Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。

  2. Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。

  3. Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。

  4. 总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。

3 Mybatis

  1. mybatis配置
  2. SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
  3. mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
  4. 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
  5. 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
  6. mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
  7. Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
  8. Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
  9. Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

参考

Java就业企业面试问题-ssm框架(强烈推荐)

html转jsp页面样式发生改变

jsp页面DOCTYPE声明不对或者没有声明

修改idea jsp模板

file->settings->Editor->File and Code Templates->Other->jsp files

1
2
3
4
5
6
7
8
9
10
11
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--不加这个样式会发生改变--%>
<!DOCTYPE html>
<html>
<head>
<title>#[[$Title$]]#</title>
</head>
<body>
#[[$END$]]#
</body>
</html>

idea默认jsp模板没有设置DOCTYPE

web2.5默认

3.0默认

html5默认

参考:

html转jsp页面样式发生改变

1.返回普通的json

返回字符串,实体类

三个步骤
  • Jackson jar包是否存在于工程

    1
    2
    3
    4
    // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.8.8'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.8.8'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.8.8'
  • <mvc:annotation-driven/> 是否配置(默认配置方案,不支持返回map)

  • 返回方法上面是否添加了@ResponseBody注解。

    1
    2
    3
    4
    5
    @RequestMapping(value = "/test", method = RequestMethod.POST)
    @ResponseBody
    public String test( User user,HttpServletRequest req, HttpServletResponse response){
    return "json数据";
    }

2.map自动转换json ,<mvc:annotation-driven/> 的自定义配置

解决springmvc ResponseBody请求返回406的问题

注意不能用.html后缀

1. 显示层

前端页面login.jsp

InternalResourceViewResolver配置jsp目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>欢迎登陆</title>
</head>
<body>
<form id="login" action="<c:url value='/user/login.do'/>" method="post">
<h1>Log In</h1>
<fieldset id="inputs">
<input id="username" name="name" type="text" placeholder="Username" autofocus required>
<input id="password" name="password" type="password" placeholder="Password" required>
</fieldset>
<fieldset id="actions">
<input type="submit" id="submit" value="Log in">
<a href="">Forgot your password?</a><a href="">Register</a>
</fieldset>
</form>
</body>
</html>

前端控制层UserController.java

spring-mvc.xml配置<context:component-scan base-package="com.xuan.user.controller"/>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Controller
@RequestMapping(value = "user")
public class UserController {
@Resource
private UserService userService;
@RequestMapping(value = "/login",method = RequestMethod.POST)
public ModelAndView login(User user, HttpServletRequest req) {
ModelAndView modelAndView = new ModelAndView("index");
if (user == null) {
return new ModelAndView("login").addObject("message", "登陆信息不能为空!");
}
if (StringUtils.isEmpty(user.getName()) || StringUtils.isEmpty(user.getPassword())){
return new ModelAndView("login").addObject("message", "用户名或密码不能为空!");
}
user = userService.login(user);
modelAndView.addObject("user", user);
return modelAndView;
}
}

2.业务控制层

service接口层

业务接口UserService.java

1
2
3
public interface UserService {
public User login(User user);
}

service接口实现层(impl)

业务实现UserServiceImpl.java

1
2
3
4
5
6
7
8
9
@Service("userService")
public class UserServiceImpl implements UserService{
@Resource
private UserDao userDao;
@Override
public User login(User user) {
return userDao.findByUser(user);
}
}

3.持久层

spring-beans.xml配置MapperScannerConfigurer

1
<context:component-scan base-package="com.xuan"/>

接口层UserDao.jva

1
2
3
4
@Repository //注册为持久层的bean
public interface UserDao {
User findByUser(@Param("user") User user);
}

sqlmapper数据库语句

spring-bean.xml配置SqlSessionFactoryBean

userMapper.xml

1
2
3
4
5
6
7
8
9
<?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">
<!-- namespace的值就是dao接口的完整路劲,就这个demo而言namespace 就是TestDao.java的完整路劲 -->
<mapper namespace="com.xuan.user.dao.UserDao">
<select id="findByUser" parameterType="com.xuan.user.model.User" resultType="com.xuan.user.model.User">
SELECT * FROM x_user WHERE (`name`=#{user.name} OR `email`=#{user.email} OR `phone`=#{user.phone}) AND `password`=#{user.password};
</select>
</mapper>

4. 实体

model实体层

mybatis-conf.xml配置<typeAliases><package name="com.xuan.user.model"/></typeAliases>

实体类User.java

1
2
3
4
5
6
public class User(){
.....
private String name;
private String password;
.....
}

1. 新建项目ssm_template

creat project->gradle{java+web}->{GroupId:com.xuan;artifactId:ssm_template}->next->finsh

2. 创建项目目录和文件

根目录/ 描述
src/main/webapp/WEB-INF/web.xml Project Structure->Modules->+ssm_template->ssm_template_main->Web Gradle...->{点击+web.xml:src\main\webapp\WEB-INF\web.xml}[^1]
src/main/java Mark as: Sources(默认是,不用配置),java代码目录
src/main/resources Mark as: Resources(默认是,不用配置),配置资源文件目录
src/main/resources/config 配置文件目录(例如:spring-mvc.xml)
src/main/resources/sqlMapper 数据库语句配置目录
src/main/java/com.xuan/dao 数据库接口层
src/main/java/com.xuan/controller

[^1]: 勾上source root{…/resources,…/java}配置Artifacts,删除Web Application:Exploded下红色的目录

3.配置web.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<servlet>
<!--名称 -->
<servlet-name>dispatcher</servlet-name>
<!-- Servlet类 -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/spring-mvc.xml</param-value>
</init-param>
<!-- 启动顺序,数字越小,启动越早 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!--所有请求都会被dispatcher拦截 -->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

4. 配置build.gradle

导入相关的ssm包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apply plugin: 'groovy'  //+
apply plugin: 'idea' //+
dependencies {
compile group: 'org.codehaus.groovy', name: 'groovy-all', version: '2.4.7'
compile group: 'javax.servlet', name: 'jstl', version: '1.2'
// Spring
compile group: 'org.springframework', name: 'spring-core', version: '4.3.4.RELEASE'
compile group: 'org.springframework', name: 'spring-web', version: '4.3.4.RELEASE'
compile group: 'org.springframework', name: 'spring-webmvc', version: '4.3.4.RELEASE'
compile group: 'org.springframework', name: 'spring-jdbc', version: '4.3.4.RELEASE'
compile group: 'org.springframework', name: 'spring-aop', version: '4.3.4.RELEASE'
compile group: 'org.springframework', name: 'spring-context', version: '4.3.4.RELEASE'
compile group: 'org.springframework', name: 'spring-beans', version: '4.3.4.RELEASE'
compile group: 'org.springframework', name: 'spring-test', version: '4.3.4.RELEASE'
// MyBatis
compile group: 'org.mybatis', name: 'mybatis', version: '3.4.1'
compile group: 'org.mybatis', name: 'mybatis-spring', version: '1.3.0'
compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.40'
// junit
compile group: 'junit', name: 'junit', version: '4.12'
}

5. 配置spring-mvc.xml

右键new spring config需要先导包才能直接new

路径:/src/main/resources/config/spring-mvc.xml

project structure配置:Create Spring facet spring mvc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!-- 自动扫描控制器,实现支持注解的IOC ,设置要扫描的包,一般含controller类的包(解释有问题,不扫描dao,会提示错误,但不影响运行)-->
<context:component-scan base-package="com.xuan"/>
<!-- Spring MVC不处理静态资源 -->
<mvc:default-servlet-handler/>

<!-- 支持mvc注解驱动,控制器映射器和控制器适配器 -->
<mvc:annotation-driven/>

<!--静态文件访问权限配置(静态资源映射器)-->
<mvc:resources mapping="statics/**" location="/WEB-INF/"/>

<!-- 视图解析器 -->
<bean id="internalResourceViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀,设置页面的目录 -->
<property name="prefix" value="/"/>
<!-- 后缀,页面的后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
<import resource="spring-mybatis.xml"/>

6. 配置spring-mybatis.xml

右键new spring config

路径:/src/main/resources/config/spring-mybatis.xml

project structure配置:Create Spring facet spring mybatis parent contestspring mvc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<!--加载jdbc文件-->
<context:property-placeholder location="classpath:config/jdbc-mysql.properties"/>
<!-- 配置数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>

<!-- 配置Session工厂 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 加载mybatis-config.xml文件,mybatis配置文件路径 -->
<property name="configLocation" value=""/>
<!--自动扫描需要定义类别名的包,将包内的JAVA类的类名作为类别名-->
<property name="typeAliasesPackage" value="com.xuan.model"/>

<!-- 指定实体类映射文件,可以指定同时指定某一包以及子包下面的所有配置文件,可以直接指定文件 -->
<property name="mapperLocations" value="classpath:sqlMapper/*.xml"/>
</bean>

<!--动态代理实现 不用写dao的实现 -->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 这里的basePackage 指定了dao层接口路劲,这里的dao接口不用自己实现 -->
<property name="basePackage" value="com.xuan.dao"/>
<!-- 如果只有一个数据源的话可以不用指定,但是如果有多个数据源的话必须要指定 -->
<!-- <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> -->
<!--直接指定了sqlsessionTemplate名称,这个和上面的其实是一样的 -->
<!-- <property name="sqlSessionTemplateBeanName" value="sqlSession" /> -->
</bean>

<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>

<!-- 使用全注释事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

7. 配置jdbc-mysql.properties

1
2
3
4
5
6
7
8
9
10
# 将jdbc.jarDirection后的内容更改为gradle下载的
# mysql-connector-java-5.1.x.jar所在的路径,gradle自动下载的路径如下所示(未使用)
jdbc.jarDirection=/Users/xuan/.gradle/caches/modules-2/files-2.1/mysql\
/mysql-connector-java/5.1.40/ef2a2ceab1735eaaae0b5d1cccf574fb7c6e1c52/\
mysql-connector-java-5.1.40.jar
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm_template?\
useUnicode=true&characterEncoding=UTF-8&useSSL=false
jdbc.username=root
jdbc.password=root

8. 创建数据库ssm_template

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE DATABASE /*!32312 IF NOT EXISTS*/`ssm_template` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `ssm_template`;

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for ssm_test
-- ----------------------------
DROP TABLE IF EXISTS `ssm_test`;
CREATE TABLE `ssm_test` (
`name` varchar(255) DEFAULT NULL,
`value` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of ssm_test
-- ----------------------------
INSERT INTO `ssm_test` VALUES ('ssm', 'ssm框架搭建完成');

9. 测试相关文件

index.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<a href="test">点击测试ssm框架</a>
<br>
name:${ssmTest.name}
<br>
value:${ssmTest.value}
</body>
</html>
SsmTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class SsmTest {
String name;
String value;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getValue() {
return value;
}

public void setValue(String value) {
this.value = value;
}
}
SsmTestDao.java
1
2
3
4
@Repository
public interface SsmTestDao {
SsmTest getSsm(String name);
}
TestController.java
1
2
3
4
5
6
7
8
9
10
11
12
@Controller
public class TestController {
@Resource
private SsmTestDao ssmTestDao;
@RequestMapping("test")
public String totestPage(Model model){
SsmTest ssmTest= ssmTestDao.getSsm("ssm");
System.out.printf(""+ssmTest.getValue()+","+ssmTest.getName());
model.addAttribute("ssmTest",ssmTest);
return "index";
}
}
ssm_test.xml
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8" ?>
<!--doctype必须加-->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace的值就是dao接口的完整路劲,就这个demo而言namespace 就是TestDao.java的完整路劲 -->
<mapper namespace="com.xuan.dao.SsmTestDao">
<!-- 这里的id就是接口中方法的名称,resulType,返回的bean,这里为String -->
<select id="getSsm" parameterType="String" resultType="com.xuan.model.SsmTest">
SELECT * FROM ssm_test WHERE name= #{name}
</select>
</mapper>

相关配置截图

62IMgs.png
62IK3j.png
62IeUS.png
62IuCQ.png
62Im4g.png
62IQvn.png
62I1uq.png

项目地址:

https://github.com/xuanfong1/ssm_template

如果运行不起,注意out目录,删除重试

项目配置

build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
group 'com.xuan'
version '1.0-SNAPSHOT'

apply plugin: 'groovy'
apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'idea'

sourceCompatibility = 1.8

repositories {
mavenCentral()
}

dependencies {
compile group: 'org.codehaus.groovy', name: 'groovy-all', version: '2.4.7'
compile group: 'javax.servlet', name: 'jstl', version: '1.2'
// Spring
compile group: 'org.springframework', name: 'spring-core', version: '4.3.4.RELEASE'
compile group: 'org.springframework', name: 'spring-web', version: '4.3.4.RELEASE'
compile group: 'org.springframework', name: 'spring-webmvc', version: '4.3.4.RELEASE'
compile group: 'org.springframework', name: 'spring-jdbc', version: '4.3.4.RELEASE'
compile group: 'org.springframework', name: 'spring-aop', version: '4.3.4.RELEASE'
compile group: 'org.springframework', name: 'spring-context', version: '4.3.4.RELEASE'
compile group: 'org.springframework', name: 'spring-beans', version: '4.3.4.RELEASE'
compile group: 'org.springframework', name: 'spring-test', version: '4.3.4.RELEASE'
// MyBatis
compile group: 'org.mybatis', name: 'mybatis', version: '3.4.1'
compile group: 'org.mybatis', name: 'mybatis-spring', version: '1.3.0'
compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.40'
// junit
compile group: 'junit', name: 'junit', version: '4.12'

testCompile group: 'junit', name: 'junit', version: '4.12'

}

web.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<!--名称 -->
<servlet-name>dispatcher</servlet-name>
<!-- Servlet类 -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/spring/spring-mvc.xml</param-value>
</init-param>
<!-- 启动顺序,数字越小,启动越早 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!--所有请求都会被dispatcher拦截 -->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

spring-mvc.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?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:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 自动扫描控制器,实现支持注解的IOC ,设置要扫描的包,一般含controller类的包-->
<context:component-scan base-package="com.xuan"/>

<!-- Spring MVC不处理静态资源 -->
<mvc:default-servlet-handler/>

<!-- 支持mvc注解驱动,控制器映射器和控制器适配器 -->
<mvc:annotation-driven/>

<!--静态文件访问权限配置(静态资源映射器)-->
<mvc:resources mapping="statics/**" location="/WEB-INF/"/>

<!-- 视图解析器 -->
<bean id="internalResourceViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀,设置页面的目录 -->
<property name="prefix" value="/"/>
<!-- 后缀,页面的后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
<import resource="spring-mybatis.xml"/>
</beans>

spring-mybatis.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--加载jdbc文件-->
<context:property-placeholder location="classpath:config/mybatis/jdbc-mysql.properties"/>
<!-- 配置数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>

<!-- 配置Session工厂 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 加载mybatis-config.xml文件,mybatis配置文件路径 -->
<property name="configLocation" value=""/>
<!--自动扫描需要定义类别名的包,将包内的JAVA类的类名作为类别名-->
<property name="typeAliasesPackage" value="com.xuan.model"/>

<!-- 指定实体类映射文件,可以指定同时指定某一包以及子包下面的所有配置文件,可以直接指定文件 -->
<property name="mapperLocations" value="classpath:sqlMapper/*.xml"/>
</bean>

<!--动态代理实现 不用写dao的实现 -->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 这里的basePackage 指定了dao层接口路劲,这里的dao接口不用自己实现 -->
<property name="basePackage" value="com.xuan.dao"/>
<!-- 如果只有一个数据源的话可以不用指定,但是如果有多个数据源的话必须要指定 -->
<!-- <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> -->
<!--直接指定了sqlsessionTemplate名称,这个和上面的其实是一样的 -->
<!-- <property name="sqlSessionTemplateBeanName" value="sqlSession" /> -->
</bean>

<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>

<!-- 使用全注释事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>

jdbc-mysql.properties

1
2
3
4
5
6
7
8
9
10
# 将jdbc.jarDirection后的内容更改为gradle下载的
# mysql-connector-java-5.1.x.jar所在的路径,gradle自动下载的路径如下所示(未使用)
jdbc.jarDirection=/Users/xuan/.gradle/caches/modules-2/files-2.1/mysql\
/mysql-connector-java/5.1.40/ef2a2ceab1735eaaae0b5d1cccf574fb7c6e1c52/\
mysql-connector-java-5.1.40.jar
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/goods?\
useUnicode=true&characterEncoding=UTF-8&useSSL=false
jdbc.username=root
jdbc.password=root

配置文件路径

路径(根目录/) 说明
src/main/webapp/WEB-INF/web.xml 基本配置文件(第一步,包含spring-mvc.xml)
src/main/resources/config/spring/spring-mvc.xml 配置spring(包含spring-mybatis.xml)
src/main/resources/config/spring/spring-mybatis.xml 配置mybatis(包含sqltest.xml和jdbc-mysql.properties)
src/main/resources/config/mybatis/jdbc-mysql.properties 数据库连接信息配置

项目示例:

测试文件路径

路径(根目录/) 说明
src/main/resources/sqlMapper/sqltest.xml 数据库语句
src/main/java/…/dao/TestDao.java 持久层,连接数据库(sqltest)
src/main/java/…/controller/xuantest.java

TestDao.java

1
2
3
4
5
6
7
8
package com.xuan.dao;

import org.springframework.stereotype.Repository;

@Repository //注册为持久层的bean
public interface TestDao {
String findname();
}

sqltest.xml

1
2
3
4
5
6
7
8
9
10
11
<?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">

<!-- namespace的值就是dao接口的完整路劲,就这个demo而言namespace 就是TestDao.java的完整路劲 -->
<mapper namespace="com.xuan.dao.TestDao">
<!-- 这里的id就是接口中方法的名称,resulType,返回的bean,这里为String -->
<select id="findname" resultType="java.lang.String">
SELECT email FROM t_user WHERE loginname='123'
</select>
</mapper>

xuantest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.xuan.controller;

import com.xuan.dao.TestDao;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;

@Controller
public class xuantest {
@Resource
private TestDao testDao;
@RequestMapping("test.html")
public ModelAndView totestPage(){
String a= testDao.findname();
System.out.printf(a);
return new ModelAndView("test");
}
}

index.jsp

1
2
3
4
5
6
7
8
9
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<a href="test.html">进入web测试页面</a>
</body>
</html>

test.jsp

1
2
3
4
5
6
7
8
9
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>spring</title>
</head>
<body>
ssm配置成功
</body>
</html>
参考:

常用的两种spring、mybatis 配置方式

使用IDEA和gradle创建超市管理系统(一)

使用IDEA和gradle搭建Spring MVC和MyBatis开发环境

【ssm个人博客项目实战01】SSM环境搭建

项目基本目录结构

项目根/ 说明 Mark as
pom.iml 项目资源目录配置文件[^可视化配置界面] 自动生成
src/main/java 源代码目录,存放java代码 Sources
src/main/resources 配置(资源)文件存放目录 Resources
src/main/webapp 存放静态网页目录 web目录[^web目录设置]
src/test/java 测试代码目录 Tests
src/test/resources 测试配置(资源)文件目录 Tests Resources
target/ 输出根目录 Excluded

[^可视化配置界面]: 在Project Structure->Modules->Sources
[^web目录设置]: 在Project Structure->Modules->项目名->Web->配置xml的位置和web的目录和保护的资源目录

项目额外目录结构

项目根/ 说明 Mark as
src/site 与site相关资源目录
src/main/filters 资源过滤文件目录
src/main/assembly Assembly descriptors
src/mian/config 配置文件目录
src/main/scripts Application/Library scripts
src/test/filters 测试资源过滤文件目录
target/classes 项目主体输出目录
target/test-calsses 项目测试输出目录
target/site 项目site输出目录
LICENSE.md 项目license
NOTICE.md Notices and attributions required by libraries that the project depends on
README.md 项目readme
子项目打包

mvn clean package -pl module_name -am

mvn clean package -pl pf_model/bpf_pf_platform,pf_model/bpf_pf_process -am

-am –also-make 同时构建所列模块的依赖模块;

-amd -also-make-dependents 同时构建依赖于所列模块的模块;

-pl –projects 构建制定的模块,模块间用逗号分隔;

-rf -resume-from 从指定的模块恢复反应堆。

参考:

7天学会Maven(第二天——Maven 标准目录结构)

新建maven项目

new Project->Maven[^1]->...->finsh

[^1]: 如果加载不出来,修改内存Bulid->Build Tools->Maven->Importing->VM options for importer:{-Xmx2048m}

1. 新建grade项目步骤

相当于一个grade的工作空间

New Project -> Gradle -> [java] -> Next -> {Groupld:"com.xuan",Artifactld:"worksapcename"} -> Next -> Next -> Finish

2. 在grade项目新建model

新建一个springmvc项目(这里是一个model)

New Module->spring-[Spring MVC,Web Application,Application Server]->module name

3.运行程model

注意:

运行不起,请处理project structure配置里面的问题,具体操作参考上一篇eclipse项目导入idea

4.建立mvc目录结构

详见JavaEE之MVC目录结构idea之maven目录结构笔记

5.配置web.xml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<context-param>
<!--SpringMVC配置参数文件的位置 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
<!--名称 -->
<servlet-name>dispatcher</servlet-name>
<!-- Servlet类 -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:dispatcher-servlet.xml</param-value>
</init-param>
<!-- 启动顺序,数字越小,启动越早 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!--所有请求都会被dispatcher拦截 -->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

6.Spring MVC配置文件spring-mvc.xml[^spring application context设置]

配置文件的目录设置在web.xml中的contextConfigLocation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?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:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 自动扫描包,实现支持注解的IOC ,设置要扫描的包,一般含controller类的包-->
<context:component-scan base-package="com.xuan.web.controller" />

<!-- Spring MVC不处理静态资源 -->
<mvc:default-servlet-handler />

<!-- 支持mvc注解驱动 -->
<mvc:annotation-driven />

<!-- 视图解析器 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<!-- 前缀,设置页面的目录 -->
<property name="prefix" value="/" />
<!-- 后缀,页面的后缀 -->
<property name="suffix" value=".jsp" />
</bean>
</beans>

7. DispatcherServlet配置文件dispatcher-servlet.xml[^spring servlet Application context设置]

1
2
3
4
5
6
<?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.xsd">

</beans>

测试

index.jsp文件

1
2
3
4
5
6
7
8
9
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<a href="test.html">进入web测试页面</a>
</body>
</html>

test.jsp文件

1
2
3
4
5
6
7
8
9
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
springmvc配置成功
</body>
</html>

TestController.java

1
2
3
4
5
6
7
@Controller
public class TestController {
@RequestMapping("test.html")
public ModelAndView totestPage(){
return new ModelAndView("test.jsp");
}
}
spring简单测试流程
1
2
3
4
5
6
7
8
9
10
11
index=>start: index.jsp请求test.html
DispatcherServlet=>operation: DispatcherServlet.java过滤找到分配到指定前端控制器(需要配置xml)
TestController=>operation: 前端控制器TestController.java
mvc=>operation: 后台业务逻辑(跳转逻辑)
modelAndView=>operation: 返回modelAndView
page=>operation: 前台页面test.jsp展示数据
e=>end
index->DispatcherServlet->TestController->mvc->modelAndView->page->cond



参考:

Spring学习(二)——使用Gradle构建一个简单的Spring MVC Web应用程序

[^spring application context设置]: Project Structure->Modules->项目名->Spring->+->{name:"取个名字";选择设置的文件 }
[^spring servlet Application context设置]: Project Structure->Modules->项目名->Spring->+->{name:"取个名字";选择设置的文件;父设置spring application context}

Project Structure设置

Modules 设置
Sources
1
2
3
4
5
6
7
8
9
10
11
12
—— e:\workspace\test    //工程目录
—— ——.idea
—— ——.settings
—— ——.build
—— —— ——.classes
—— ——META-INF
—— ——out //默认输出目录(设置为Excluded)
—— —— ——artifacts
—— —— —— ——test //编译好的webapp
—— —— ——production
—— ——src //java代码目录(设置为Sources)
—— ——WebContent //web静态代码目录(含js、jsp、html、css...)
Paths

编译输出目录选择默认选项Inherit project….path

Dependencies

添加工程需要jar包,一般在/WebContent/WEB-INF/lib,必须添加tomcat的library,不然servlet着不到包

Facets 设置

添加Web选择自己的项目

  • 更改Deployment Descriptors为自己项目的web.xml路径(/WebContent/WEB-INF/web.xml
  • 更改Web Resource Directories为自己项目的web资源目录(.../WebContent) path … root 设置为/根目录
  • Source Roots勾选…/src路径
Artifacts

设置webapp发布部署输出目录

添加Web Application:Exploded

output directory: c:\develop\tomcat\webapp\test

1
2
3
4
5
6
7
——output root    //这个是output directory设置的目录
—— ——WEB-INF
—— —— ——classes
—— —— —— ——'test' compile output //项目Java编译src中java输出class的目录
—— —— ——lib //jar包目录
—— ——'test' module:'web' facet resources //设置facet resources 为自己的web目录(/WebContent)
//Available Elements(右边)是提示,可以双击直接在右边生成建议目录,设置了test下没有二级目录

配置运行tomcat Server

Run/Debug Configurations设置
Server 默认
Deployment
  • 点击+,添加要运行的test项目
  • application context 设置为/test

访问地址localhost:8080/testhttp://127.0.0.1:8080/test

eclipse java web项目导入到idea