SSM框架整理--------(一)
(笔记整理,仅供参考,可以互相交流学习有问题的话希望大家可以留言指出)
在用SSM框架前先都对这三种框架技术了解。
Spring、Spring-MVC、MyBatis。(具体见其他整理的文章,之后附上链接地址)
MyBatis:
MyBatis 是一个可以自定义SQL、存储过程和高级映射的持久层框架。MyBatis 摒除了大部分的JDBC代码、手工设置参数和结果集重获。MyBatis 只使用简单的XML 和注解来配置和映射基本数据类型、Map 接口和POJO 到数据库记录。MyBatis主要解决数据的持久化问题。
Spring:主要实现控制反转和依赖注入
Spring-MVC:
Spring Web MVC也是服务到工作者模式的实现,但进行可优化。前端控制器是DispatcherServlet;
应用控制器其实拆为处理器映射器(Handler Mapping)进行处理器管理和视图解析器(View Resolver)进行视图管理;页面控制器/动作/处理器为Controller接口(仅包含ModelAndView handleRequest(request, response)
方法)的实现(也可以是任何的POJO类);支持本地化(Locale)解析、主题(Theme)解析及文件上传等;提供了非常灵活的数据验证、格式化和数据绑定机制;提供了强大的约定大于配置(惯例优先原则)的契约式编程支持。
一、首先在创建Maven项目时选择
二、导入初始(空的)web.xml文件
在创建出来Maven项目之后,配置初始web.xml文件(解决pom.xml中报错问题)
三、导入Maven项目需要的jar包
导入(空的)web.XML文件后,解决了项目报错问题,进入pom.xml文件中,不管什么项目,在开始的时候首要任务就是导包(这个环节非常重要,一定要找一个网络畅通的地方下载......不然后面jar包出问题的话真的是让人头疼。推荐去Maven库中下载,注意版本一致的问题),接下来说明一下我这里用到的几个包
1、spring-webmvc
2、spring-orm (spring充当了容器的作用,简单的说就是不需要你自己去new一个新的对象,把这项工作交给spring去管理,咱们只需要在定义成员变量的时候在它的上面加一个注解@Resource即可,就相当于把创建该对象的工作交给了Spring去解决。)
补充:成员变量和属性的区别
3、mybatis(主要作用是简化JDBC也可以说是对JDBC一个很好的封装,精炼代码,作用于数据的持久层)
4、mybatis-spring(Spring和MyBatis是隶属于两个公司的,所以在设计模式方面可能有不同,所以需要导入这个包,起到了连接MyBatis和Spring的作用)
5、mysql-connector-java(当需要操作数据库中的数据时,需要写sql的语句,调用Java环境下的这个包)
6、druid(数据源,起到一个连接池的作用。)
7、lombok(也叫小辣椒,在写pojo的时候可以省去写get和set的方法,在类上方写@Data的注解,但是偶尔会出现写上注解但是属性那里仍然会报该属性未被使用,所以需要更改一些设置如下)
当导入@Data注解无效时,可以从本地的jar包中找到lombok.jar,复制一份到eclipse的安装目录下,然后在安装目录中找到eclipse.ini配置文件,在最后一行加入一行 -javaagent:lombok.jar
这里的lombok.jar必须与你之前黏贴到eclipse安装目录下的jar包名字相同。然后重启eclipse问题就可以解决。(如果还不可以的话考虑jar是否下载成功,或者更换一个版本的小辣椒试试。)
8、jstl(在JSP页面输出数据时用到的。尽量用2.0的版本)
补充:如果发现jar包在下载的过程中出现问题,需要去本地的库中把jar包都删除了再重新下载。仅在eclipse中删除jar包是不会修复jar包的下载失败的问题的。
四、配置web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" 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">
这里填写配置文件
</web-app>
1、配置监听器
监听器的类的位置:
spring-web >> org.springframework >> web >> context >> ContextLoaderListener
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
2、指定Spring-IoC容器配置文件的位置
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:config/applicationContext.xml</param-value>
</context-param>
<param-name>contextConfigLocation</param-name>//这里面的名字最好写成这个格式,做到见名知意
classpath*: 指的是在类的根目录下 3、配置过滤器
这里为了避免编码格式不统一造成的乱码,所以对所有的请求都进行过滤,对他们的编码格式进行设置
过滤器的类的位置:
spring-web >> org.springframework >> web>> filter >> CharacterEncodingFilter
<!-- 过滤器 -->
<filter>
<filter-name>Encoding</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>forceRequestEncoding</param-name>//过滤器中对请求的编码格式的改变默认是false
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>forceResponseEncoding</param-name>//过滤器中对响应的编码格式的改变默认是false
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Encoding</filter-name>//这里的名字必须与上面的<filter-name>中的名字保持一致
<url-pattern>*</url-pattern>//过滤器过滤所有的请求
</filter-mapping>
4、配置Spring-MVC核心拦截器
拦截器的类的位置:
spring-webmvc >> org.springframework.web.servlet >> DispatcherServlet
<!-- 配置Spring-MVC核心拦截器 -->
<servlet>
<servlet-name>MVC-Dis</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:config/MVC-Dis-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>MVC-Dis</servlet-name> <!-- 这里的名字必须与上面<servlet-name>的名字一致 -->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
五、编写jdbc.propertise文件(存储与数据库连接的信息)需要记住!!!
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://192.168.242.128:3306/xxl?characterEncoding=utf-8
username=root
password=123456
192.168.242.128 是我虚拟机中的IP地址,如果没有用虚拟机可以用自己本地的IP地址或者写localhost
调用jdbc.properties文件需要在applicationContext.xml中配置的信息是(这样才可以通过E-L表达式来调取文件中的数据):
<!-- 加载JDBC配置文件 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" value="classpath:jdbc.properties"></property>
</bean>
下面在applicationContext.xml文件中配置数据源的时候需要调用这里的信息,可以通过E-L表达式来调取
六、applicationContext.xml文件的配置
当<bean name=" " class=" ">当在后面有class属性的时候,前面的name属性就不可以随便写值,如果这个类是自己定义的,则名字可以自己随便起,但是如果是调用系统的或者别人现成的jar包的话就需要必须参考class的源码去写(name的值必须是在class中已经有定义的属性或者成员变量)。
<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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 该文件用于配置Spring-IoC容器 -->
<!-- 扫描包 -->
<context:component-scan base-package="com.neuedu"></context:component-scan>
<!-- 加载JDBC配置文件 --> //类的具体位置spring-beans >> org.springframework.beans >> factory >> config >> PropertyPlaceholderConfigurer
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" value="classpath:jdbc.properties"></property>
</bean>
<!-- 配置数据源(数据库连接池) -->
<!-- bean标签的name和class相当于:
DruidDataSource dataSource = new DruidDataSource(); --> //类的具体位置:druid >> com.alibaba.druid >> pool >> DruidDataSource
<bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${driver}"></property> //这里的name不可以随便写,都是类中已经定义过得属性或者成员变量,value值通过EL表达式来提取,相关的配置文件见下面jdbc.properties文件
<property name="url" value="${url}"></property>
<property name="username" value="${username}"></property>
<property name="password" value="${password}"></property>
</bean>
<!-- 配置MyBatis的sqlSessionFactoryBean --> //类的具体位置: mybaits >> org.mybatis.spring >> SqlSessionFactoryBean
<bean name="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property> //后面的dataSource是引用上面数据源的
<property name="typeAliasesPackage" value="com.neuedu"></property> //起别名,具体用途见UserDao.xml中可以看到
</bean>
<!-- 配置MyBatis自动映射的路径 -->
//类的具体位置: mybaits >> org.mybatis.spring >> mapper >> MapperScannerConfigurer
<bean name="ScannerMapper" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.neuedu.dao"></property></bean></beans>六、完成四层架构
四层架构相互调用:dao层调用pojo层,service层调用dao层,web(或者说controller层)调用service层
1、pojo层:定义属性,因为要和数据库中的数据进行交互,所以务必让pojo层中的属性名与数据库中的字段名相同。
2、dao层:数据持久层
定义一个接口,写上业务需要的方法(这里演示查询表中的所有数据,注意返回类型是泛型)
/**
* 使用mybatis框架的话,这里的接口就不需要写实现类,直接在该包下写一个映射文件(xml文件)
* 自动映射的条件:
* 1、必须和该接口的名字一致(UsersDao.xml)
* 2、必须和该接口同处于同一个包下
* @author Administrator
*
*/
public interface UserDao {
public List<User> getAllUser();
}
sql语句执行等都写在相应的XML文件中,这也是MyBatis的一个方便之处(以下为UserDao.xml的内容)
注意:这里执行的sql语句先在Navicat中执行成功之后再放入,尽量不要写*。
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> //这里可以调用mybatis的模板
<mapper namespace="com.neuedu.dao.UserDao"> //这里的命名空间写接口的完全限定名,这可以避免整个项目中会有文件重名的情况
<!-- 这里的ID名必须与实现的接口中的方法名一致 -->
<!-- resultType中本应该写“com.neuedu.pojos.User”,但是在applicationContext文件中配置了别名,所以此处直接写User即可 -->
<select id="getAllUser" resultType="User">
select id,username,userpwd from userx;
</select>
</mapper>
3、service层先创建一个UserService接口,在接口中写逻辑业务需要的方法(和dao层一样)。之后写一个UserService的实现类UserServiceImpl。
/**
* Service层需要调用Dao层,需要再Dao层上加@Resource的注解
* @Service 标明这是service层
* @author Administrator
*
*/
@Service
public class UserServiceImpl implements UserService {
//@Resource是把UserDao的对象注入到容器中
@Resource
private UserDao ud;
@Override
public List<User> queryAllUser() {
return ud.getAllUser();
}
}
4、web层(也叫controller层)
@Controller //标明这是controller层,这层引用service层
public class UserAction {
@Resource
private UserServiceImpl usi;
//@RequestMapping() 匹配返回的结果
@RequestMapping("user.action")
public ModelAndView getUsers() {
List<User> user = usi.queryAllUser();
ModelAndView mv = new ModelAndView();
mv.addObject("list",user);
//跳转到指定目录下的页面
mv.setViewName("/WEB-INF/pages/user.jsp");
return mv;
}
}
七、配置Spring-MVC拦截器
<!-- Spring-MVC替代的是web层,因为不用去写servlet层了 -->
<!-- 扫描包 让Spring去扫描带@controller的包中的类-->
<context:component-scan base-package="com.neuedu.web"></context:component-scan>
<!-- 注解驱动:想用注解的形式去编写程序需要配置一句话 -->
<mvc:annotation-driven/>
八、写JSP页面,将数据库中的信息输出
下面的这行代码是JSTL的jar包中的标签,用该标签调用其中的forEach方法。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
forEach标签的用法,相当于java中的foreach一样,不过这里需要用标签来写。prefix="c"是一个前缀,相当于在JSP页面中用前缀为c的标签就是调用了core中的东西。<c:foreach items="${XXXX}" var="YYYY">标签里面需要设置两个属性,一个是items,这是在第七步中web层中写到的mv.addObject("list",user) 前面的"list",而标签中另一个属性var则是说我们需要一个变量在下面输出的时候有一个暂时的变量去存放"list"中的数据集合等。(items必须对应web层中存放数据集合或者结果的mv.addObject("list",user),而且必须用E-L表达式去接收。 var就可以自己随便起名了,只是这里命名之后下面在数据的调用需要用到你自己定义的变量名去get、set一些属性。)
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<table>
<thead>
<tr>
<th>用户ID</th>
<th>用户名</th>
<th>密码</th>
</tr>
</thead>
<tbody>
<c:forEach items="${list }" var="users" >
<tr>
<td>${users.id }</td>//这里数据的调取必须用E-L表达式来接收
<td>${users.username }</td>
<td>${users.userpwd }</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
上一篇: 从零写一个编译器(完结):总结和系列索引
下一篇: Executor框架整理(一)