一。大概构成
1.mvc :model,view,controller。mybatis的作用是处理后端的数据,和数据库进行交互。springmvc是控制层,主要获取controller和controllerAdvice。spring主要作用是视图和连接其他两个的工具。
2.大概的流程:前端发送请求交给controller了来处理,在controller层调service的方法,service再从具体的XXmapper.xml获取增删改查操作,前端的id数据可以从前端传来一些,增删改查完了以后,就开始往service,controller层推返回的结果,最后返回给前端一个页面。
3.具体的模块是
1.首先新建一个maven工程,配置web.xml和pom.xml
<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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.neuedu.maven</groupId> <artifactId>ssm</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <!-- spring配置文件 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>4.0.0.RELEASE</version> </dependency> <!-- oracle驱动 --> <dependency> <groupId>ojdbc</groupId> <artifactId>ojdbc</artifactId> <version>6</version> </dependency> <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.37</version> </dependency> <!-- C3P0数据库连接池 --> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency> <!-- 测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> </dependency> <!-- aop前面 AND Transaction事务 --> <dependency> <groupId>net.sourceforge.cglib</groupId> <artifactId>com.springsource.net.sf.cglib</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.6.8</version> </dependency> <!-- JDBCTemplate and Transaction --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.0.0.RELEASE</version> </dependency> <!-- springmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.0.0.RELEASE</version> </dependency> <!-- upload --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.1</version> </dependency> <!-- 整合spring和mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency> <!-- JSTL --> <dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-impl</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-spec</artifactId> <version>1.2.1</version> </dependency> <!--JSON --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.1.5</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.1.5</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.1.5</version> </dependency> <!-- jsp-servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging --> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.3</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <path>/springmvc</path> <port>8080</port> </configuration> </plugin> </plugins> </build> </project>
配置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_2_5.xsd" version="2.5"> <display-name>ssm</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- Bootstraps the root web application context before servlet initialization --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>springDispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <filter> <!-- 设置一个拦截器,调整所有的乱码问题,拦截所有文件 --> <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Map all requests to the DispatcherServlet for handling --> <servlet-mapping> <servlet-name>springDispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- HiddenHttpMethodFilter过滤器可以将POST请求转化为put请求和delete请求! --> <filter> <filter-name>hiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>hiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>
2.写常用的几个类和包
1.entity包:放具体的模型如Student,employee.值得注意的是他与数据库的表的名字和类型最好一一对应,如果不是对应可以用驼峰命名,或者自定义命名。还可以通过改变sql的列名来达到统一。
2.service包:放业务层,他可以从mapper。xml中获取数据,并将数据传输给控制层。
3.contrller包:放控制器的用来从service获取数据并控制,决定了是否去前端,和传递数据的类型。
4.mapper包:放各种从数据库获得的属性,值得注意的是他是EmployMapper.java和EmployMapper.xml一起存在的,免去了配置。前者是一个接口,后者是一个实现。
5.资源包:值得注意的是它们都是在类类路径下,和上面的src下的文件是在同一级,底层就是这样翻译的。
1.applicationContext :放除控制类的所有spring注解文件,配置数据库连接池,里面需要从jdbc.properties里面获取路径密码帐号和对应驱动,可以设置多个然后自己选择。配置jdbctemplate用来处理增删改查的工具类,很好用,不用再同原生的jdbc一样繁琐了。配置sqlSessionFactoryBean,用来数据库的操作。最后配置事务和MapperScannerConfigurer用来扫描mapper接口。
<?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" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <context:component-scan base-package="com.neuedu" use-default-filters="true"> <context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <context:property-placeholder location="classpath:jdbc.properties"/> <bean id="comboPooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="${jdbc.user}"></property> <property name="password" value="${jdbc.password}"></property> <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> <property name="driverClass" value="${jdbc.driverClass}"></property> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <constructor-arg ref="comboPooledDataSource" /> </bean> <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <constructor-arg ref="comboPooledDataSource" /> </bean> <tx:annotation-driven transaction-manager="dataSourceTransactionManager"/> <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="comboPooledDataSource"></property> <property name="configLocation" value="classpath:mybatis-config.xml"></property> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.neuedu.ssm.mapper"></property> </bean> </beans>
2.springMvc.xml:放控制类的注解,用来专门处理控制层。设置一个前缀后缀。设置静态文件的访问和注册了DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter两个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" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd 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-4.0.xsd"> <context:component-scan base-package="com.neuedu" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"></property> <property name="suffix" value=".jsp"></property> </bean> <mvc:view-controller path="/abc" view-name="success"/> <mvc:annotation-driven/> <mvc:default-servlet-handler/> </beans>
3.log4j.xml:生成对应的日志,用来检查程序的运行错误
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> <param name="Encoding" value="UTF-8" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) " /> </layout> </appender> <logger name="java.sql"> <level value="debug" /> </logger> <logger name="org.apache.ibatis"> <level value="info" /> </logger> <root> <level value="debug" /> <appender-ref ref="STDOUT" /> </root> </log4j:configuration>
4.mybatis:设置了驼峰命名和懒加载。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> <!-- 开启懒加载机制 ,默认值为true--> <setting name="lazyLoadingEnabled" value="true"/> <!-- 开启的话,每个属性都会直接全部加载出来;禁用的话,只会按需加载出来 --> <setting name="aggressiveLazyLoading" value="false"/> </settings> </configuration>
5.jdbc.properties. 提供数据库连接的一些属性。
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/mytabis?rewriteBatchedStatements=true
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.user=root
jdbc.password=yantao
三.数据库的数据
id是int型,user_name是string,gender是boolean,email是string,d_id是int型。需要注意的是系统用了驼峰式也就是说他会把数据库里的下划线去掉,并将下划线后面的第一个字母大写,完成属性对应即可,也可以自己设置属性对应。gender是0和1对应的false和true也就是女和男。
四。前端页面
1.主页index.jsp,这是一个连接,通过链接来获取后端操作。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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>Insert title here</title> </head> <body> <a href="${pageContext.request.contextPath}/getList">获取列表</a> </body> </html>
2.success.jsp,用来点击返回到前端的属性。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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>Insert title here</title> </head> <body> <h1>成功</h1> ${list} </body> </html>
五。java具体的代码
1.实体类
package com.neuedu.ssm.entity; public class Employee { private int id; private String userName; private boolean gender; private int dId; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserName() { return userName; } public void setUserNameString(String userName) { this.userName = userName; } public boolean isGender() { return gender; } public void setGender(boolean gender) { this.gender = gender; } public int getdId() { return dId; } public void setdId(int dId) { this.dId = dId; } @Override public String toString() { return "Employee [id=" + id + ", userNameString=" + userName + ", gender=" + gender + ", dId=" + dId + "]"; } public Employee() { super(); } public Employee(int id, String userNameString, boolean gender, int dId) { super(); this.id = id; this.userName = userNameString; this.gender = gender; this.dId = dId; } }
2.业务层
package com.neuedu.ssm.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.neuedu.ssm.entity.Employee; import com.neuedu.ssm.mapper.EmployeeMapper; @Service public class EmployeeService { @Autowired private EmployeeMapper mapper; public List<Employee> getList(){ return mapper.getList(); } }
3.控制层
package com.neuedu.ssm.controller; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import com.neuedu.ssm.entity.Employee; import com.neuedu.ssm.service.EmployeeService; @Controller public class EmployeeController { @Autowired private EmployeeService service; @RequestMapping("/getList") public String getList(Map<String, Object> map){ List<Employee> list=service.getList(); map.put("list", list); return "success"; } }
4.数据库mapper接口和xml文件
package com.neuedu.ssm.mapper; import java.util.List; import com.neuedu.ssm.entity.Employee; public interface EmployeeMapper { public List<Employee> getList(); }
具体的mapper.xml
<?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.neuedu.ssm.mapper.EmployeeMapper"> <select id="getList" resultType="com.neuedu.ssm.entity.Employee" > select * from tbl_emp </select> </mapper>
六。具体的实验操作
1.运行maven项目,就是运行pom.xml,run as->maven build(第二个)->在goals运行tomcat7:run->run。
2.这时控制台会出现一个这样http://localhost:8080/springmvc
3.在浏览器运行这个网址,就可以访问主页。出现连接http://localhost:8080/springmvc/getList。并将数据库数据返回。
七.总结
做个ssm项目思路首先分析需求,这个项目就是获取数据库的数据,然后基本的spring,springmvc,mybatis,jdbc.proprties,log4j的配置。设置一个主页,从主页向控制层推,写控制java,再返回一个页面。中间取一些参数放入map中,这里就用到了数据库的操作,就可以往service层,在其中完成增删改查,再往xxxmapper接口推,最后在xxxmapper.xml实现数据库的增删改查。最后取到数据返回给页面,注意有没有前后缀和位置。