1. 三层架构和MVC
表现层:SpringMVC
业务层:Spring
持久层:Mybatis
SpringMVC 在 三层架构的位置:

mvc在b/s系统 下的应用:

springmvc框架

2. 入门程序
2.1 入门程序
- (1)导包
- (2)在web.xml中配置前端控制器:
url-pattern:*.action的请交给DispatcherServlet处理。
contextConfigLocation:指定springmvc配置的加载位置,如果不指定则默认加
(注意:SpringMVC–理解web.xml中的 url-pattern标签及其使用范围)
载WEB-INF/[DispatcherServlet 的Servlet 名字]-servlet.xml。 - (3)在classpath下的springmvc.xml中配置处理器适配器:
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
SimpleControllerHandlerAdapter:即简单控制器处理适配器,所有实现了org.springframework.web.servlet.mvc.Controller 接口的Bean作为Springmvc的后端控制器。
- (4)开发Handler
public class ItemList1 implements Controller {
需要实现 controller接口,才能由org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter适配器执行。
- (5)配置处理器映射器
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
BeanNameUrlHandlerMapping:表示将定义的Bean名字作为请求的url,需要将编写的controller在spring容器中进行配置,且指定bean的name为请求的url,且必须以.action结尾。
- (6)配置处理器
<bean name="/items1.action" id="itemList1"
class="cn.itcast.springmvc.controller.first.ItemList1"/>
name="/items1.action":前边配置的处理器映射器为BeanNameUrlHandlerMapping,如果请求的URL 为“上下文/items1.action”将会成功映射到ItemList1控制器。
- (7)配置视图解析器
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- (8)创建视图
创建/WEB-INF/jsp/order/itemsList.jsp视图页面
2.2 HandlerMapping处理器映射器
HandlerMapping 负责根据request请求找到对应的Handler处理器及Interceptor拦截器,将它们封装在HandlerExecutionChain 对象中给前端控制器返回。
(1)BeanNameUrlHandlerMapping
根据请求的url与spring容器中定义的bean的name进行匹配,从而从spring容器中找bean实例。
<!—beanName Url映射器 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
(2)SimpleUrlHandlerMapping
BeanNameUrlHandlerMapping的增强版本,它可以将url和处理器bean的id进行统一映射配置。
<!—简单url映射 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/items1.action">controller的bean id</prop>
<prop key="/items2.action">controller的bean id</prop>
</props>
</property>
</bean>
修改映射器需要修改对应的handler配置方式。此时handler可简化,不需要name属性:
// 原来:
<bean id="itemsController1" name="/queryItems_test.action" class="cn.itcast.ssm.controller.ItemsController1" />
// 此时:
<bean id="itemsController1" class="cn.itcast.ssm.controller.ItemsController1" />
2.3 HandlerAdapter处理器适配器
(1)SimpleControllerHandlerAdapter
简单控制器处理器适配器,所有实现了org.springframework.web.servlet.mvc.Controller 接口的Bean通过此适配器进行适配、执行。
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
(2)HttpRequestHandlerAdapter
HttpRequestHandlerAdapter,http请求处理器适配器,所有实现了org.springframework.web.HttpRequestHandler 接口的Bean通过此适配器进行适配、执行。
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
修改适配器需要修改对应的处理器handler实现方式。此时handler需要实现HttpRequestHandler 接口。
public class ItemsController2 implements HttpRequestHandler{
public void handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
2.4 注解开发
The prefix “mvc” for element “mvc:annotation-driven” is not bound 的解决方法
(1)修改处理器Controller的代码,添加注解
- Controller:处理器注解
- RequestMapping:映射URL注解

(2)配置处理器
可单个配置(和上面一样),也可以自动扫描。
使用组件扫描器省去在spring容器配置每个controller类的繁琐。使用<context:component-scan自动扫描标记@controller的控制器类,配置如下:
<!-- 扫描controller注解,多个包中间使用半角逗号分隔 -->
<context:component-scan base-package="cn.itcast.springmvc.controller.first"/>
(3)配置映射器和适配器
<!--注解映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!--注解适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
上面两个可用下面一行代替:
<mvc:annotation-driven></mvc:annotation-driven>
3. 整合mybatis案例
3.0 疑惑解决
javaWeb项目的classpath说明
classpath 路径在每个J2ee项目中都会用到,即WEB-INF下面的classes目录,所有src目录下面的java、xml、properties等文件编译后都会在此,所以在开发时常将相应的xml配置文件放于src或其子目录下
Spring中@Autowired 注解的注入规则
默认根据类型,匹配不到则根据bean名字
1.一个接口只有一个实现的情况下,属性名字怎么写都无所谓,因为按照类型匹配就只有一个bean
2.一个接口多个实现的情况下:
① 属性名字跟组件名字一致,组件名字可以在声明的时候指定,比如 @Service(“abc”)
② 属性名字跟组件名字不一致,配合@Qualifier 注解指定组件名字
解决Cannot delete or update a parent row: a foreign key constraint fails的mysql报错
3.1 需求
(1)从数据库查询所有的商品信息
(2)点击修改,弹出待修改的商品信息表单,修改
(3)点击提交,保存新数据到数据库。
自下而上包括DAO开发、service开发、springmvc开发
3.2 DAO开发-mapper
(1)基本文件
db.properties:数据库配置参数
log4j.properties:xml解析器配置参数
sqlMapConfig.xml:mybatis配置参数
applicationContext-dao.xml:spring中关于dao层的配置参数
(2)功能文件
这里我们使用自定义mapper.
- 1.
ItemsMapperCustom.xml:实现功能接口的SQL语句,用于数据库操作; - 2.
ItemsMapperCustom.java:功能接口; - 3.在
sqlMapConfig.xml定义别名等; - 4.在
applicationContext-dao.xml配置mapper的扫描器,执行需要的sqlSessionFactory,连接池,数据库。
3.3 service开发-service
ItemsService.java:接口
ItemsServiceImpl.java:实现类
applicationContext-service.xml:service配置文件
applicationContext-transaction.xml:事务管理
- 完成接口和实现类;
- 在applicationContext-service.xml对实现类进行配置
- 在applicationContext-transaction.xml对实现类进行事务管理配置
3.4 springmvc开发-controller
Controller:调用service实现功能
springmvc.xml:配置controller、配置处理器映射器和处理器适配器、视图解析器
web.xml:配置前端控制器和springmvc.xml、配置监听器、加载applicationContext-*.xml文件
3.5 实现修改功能
需求:根据输入的id参数选择当前商品展示并修改
dao:直接使用逆向工厂生成的mapper.xml和mapper.java接口
service:定义接口和实现类
controller
3.6 post乱码

在web.xml添加post乱码filter
在web.xml中加入:
<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>
对于get请求中文参数出现乱码解决方法有两个:
修改tomcat配置文件添加编码与工程编码一致,添加URIEncoding="utf-8"如下:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
另外一种方法对参数进行重新编码:
String userName new
String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")
ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码
此时乱码变成了“?”,修改数据库的编码为utf8,但是无效:

然后改连接参数成功:
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8
386

被折叠的 条评论
为什么被折叠?



