SpringMVC-1 springmvc和mybatis整合

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 注解指定组件名字

MySQL往数据库中存入中文字符时变问号

解决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:事务管理

  1. 完成接口和实现类;
  2. 在applicationContext-service.xml对实现类进行配置
  3. 在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值