SSM中 的SpringMVC


前言

虽然说SSM框架这个技术已经很老了,但是我个人觉得学完之后还是有很多启发的,同时也是作为一个基础去学习后面更多的框架知识。


一、SpringMVC是什么?

 (B/S )web开发的轻量级框架。

工作原理

客户端发送一条请求到服务器
DispathcherServlet  前端控制器捕获
    前端控制器调用HandlerMapping 映射处理器 ,最后返回一个执行链对象(控制器,拦截器)
            HandlerMapping首先会在控制器映射表中查找
                 控制器映射表(映射地址,控制器,控制器中的实现方法)
                 拦截映射地址,处理方法
    前端控制器 调用 HandlerAdapter ,返回 一个 MAV(ModelAndView)
                    消息转换器(数据转换)等等,最终去到控制器执行请求

    前端控制器----调用---->视图解析器 ------- 返回VIEW
    前端控制器----调用-----> VIEW 调用  .render()  渲染模型 并将模型域数据转移请求域

    前端控制器交给Tomcat渲染jsp数据
    最终由Tomcat返回给客户端渲染后的视图

配置加载流程

Tomcat(Servlet容器) ----加载----->  部署应用  ----处理(加载解析)----->web.xml
---->web (IoC) 容器
 

二、所遇到的一些问题

1.中文乱码

视图中的乱码:可以使用字符转换过滤器解决

在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>
       <init-param>
           <param-name>forceEncoding</param-name>
           <param-value>true</param-value>
       </init-param>
   </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

但是@ResponeBody 或者是使用了@RestController 注解的 输出时是不经过tomcat的渲染,所以这个字符转换过滤器是没有办法解决这两个注解所输出的中文乱码问题。

解决方案有两个

        第一个设置每个Mapping的produces属性(数量多了比较麻烦,如果只有几个可以用)

@RequestMapping(value = "/get",produces = "text/html;charset=utf-8")

        第二个是配置一个消息转换器(springMVC 的配置文件中)

 <mvc:annotation-driven validator="validator" conversion-service="conversionFactoryBean">
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg name="defaultCharset" value="UTF-8"/>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

2.路径跳转

重定向与内部转发,我个人理解两者最大的区别就是 是否有携带跳转点的数据。

重定向:是回到服务器进行一次新的的请求,不会携带前面所有的(模型域中的)数据。

内部转发:是携带着模型域中的数据去到转发的映射地址进行操作,前后的视图是共享一个数据域

对映射地址进行重定向时,有 /  则表示从项目根路径开始,没有 /  则从当前父路径 开始

重定向到同个控制器下的映射地址时(使用这个时,不要有空格)

return "redirect:方法的映射地址";

 重定向到不同控制器的话,就需要全路径(并不会默认在上下文地址下的)

return "redirect:/设置的上下文地址/控制器映射地址/方法映射地址";

 上面两种都是方法返回的重定向

还有一种是使用 http 去进行重定向

resp.sendRedirect("/my-model/Login/show");//方法参数上HttpServletResponse resp

servlet 映射匹配规则
    当两个servlet 的映射相同时,项目(自定义的)servlet 会导致 Tomcat 全局servlet 失效
    资源竞争规则:两个servlet都符合匹配规则时,以路径精准优先
    servlet 映射地址 一定要有 "/" 开头
    自定义的servlet 的映射地址不能重复

访问流程 --- mvc的访问流程
    Tomcat 自带 DefaultServlet (专门处理静态),而DefaultServlet  的默认映射地址 是 '/'
    与前端控制器的映射地址相同,被前端控制器覆盖 导致失效

前端控制器

解决的方法

        重新为DefaultServlet配置映射地址

    方法2
    在springMVC 中 重新启动 DefaultServlet
    <mvc: default-servlet-handler/>
    这种方式 是当 前端控制器 找不到映射时 启用默认映射
映射地址的区别
    /:作为应用的默认Servlet,只处理那些没有被其他Servlet明确映射的请求。
    /*:拦截应用中所有的请求,无论这些请求是否已被其他Servlet映射

       

SSM框架SpringMVC的配置主要涉及以下几个方面: 1. 配置DispatcherServlet:在web.xml文件配置DispatcherServlet,将请求分发给对应的Controller处理。 2. 配置HandlerMapping:HandlerMapping是SpringMVC用来将请求映射到对应的Controller处理方法的组件。可以通过注解或XML配置方式进行配置。 3. 配置Controller:Controller是处理请求的核心组件,可以通过注解或XML配置方式进行配置。 4. 配置ViewResolver:ViewResolver是将Controller处理后的结果映射到具体的视图页面的组件,可以通过注解或XML配置方式进行配置。 下面是一个简单的SpringMVC配置示例: web.xml: ```xml <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> ``` springmvc-config.xml: ```xml <!-- 配置扫描Controller的包 --> <context:component-scan base-package="com.example.controller" /> <!-- 配置HandlerMapping --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" /> <!-- 配置ViewResolver --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean> ``` 其,`<context:component-scan>`用于扫描Controller的包,`<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />`用于配置HandlerMapping,`<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">`用于配置ViewResolver。需要根据实际情况进行调整配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值