SpringMVC

作者: 虫儿飞ZLEI | 来源:发表于2018-11-09 21:47 被阅读0次

1.基本组件

1.1 介绍

传统的servlet做的事情是:

匹配url路径,然后浏览器里面输入相应的路径,进入到servlet里面,在servlet里面做相应的处理,在请求转发,重定向等等。

SpringMVC做的事情也是这些,它只是对传统的servlet的优化,使用SpringMVC可以更加方便,当然它不只我说的这么简单。

SpringMVC的流程:

有一个前端控制器,所有的浏览器输入的路径访问都会到它这里。然后呢它获取到不同的路径,然后判断这些路径对应哪个方法去处理(这里的方法就相当于传统的servlet类),然后呢调用相应的方法,最后呢,方法处理完了,跳转到具体的物理视图中去。

1.2组件

  • DispatcherServlet:前端控制器,接受所有的路径请求(可以通过配置,让访问jsp的请求不处理,这样浏览器可以直接获取到jsp页面)。
  • HandlerMapping:解析请求的路径,去判断要执行哪个方法。
  • HandlerAdapter:去调用具体的那个方法。
  • ViewResovler:视图解析器,解析结果,准备跳转到具体的物理视图。


    图解

2.纯配置文件搭建SpringMVC运行环境(看看)

2.1首先需要在web.xml文件中配置(idea会自己配置好)

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--自启动,不配的话,访问的时候才加载-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

因为前端控制器需要处理所有的url访问,所以这个DispatcherServlet需要配置一下。

2.2然后配置SpringMVC的配置文件

默认情况下在WEB-INF文件下会自动生成dispatcher-servlet.xml,这个就是SpringMVC的配置文件,这个文件的名字是根据web.xml中配置的DispatcherServlet的名字来生成的。


SpringMVC的配置文件的名称
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="xxxx" class="controller.xxxController"></bean>

    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="urlMap">
            <map>
                <entry key="xxx" value-ref="xxxx"/>
            </map>
        </property>
    </bean>
</beans>

配置好以后,访问http://localhost:8080/xxx就会,进入到xxxController。

下面是xxxController的代码

public class xxxController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        System.out.println("xxx");
        ModelAndView modelAndView = new ModelAndView("a.jsp");
        return modelAndView;
    }
}

进来了xxxController以后先打印xxx,然后转发到a.jsp页面

2.3修改SpingMVC 的默认配置文件的名称和位置

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--修改SpringMVC的配置文件路径-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!--自启动,不配的话,访问的时候才加载-->
        <load-on-startup>1</load-on-startup>
    </servlet>

这样在src下面建一个springmvc.xml即可,这个就是SpringMVC的配置文件了。

3.SpringMVC 容器和Spring容器是父子关系

意思就是说在Spring中的对象,在SpringMVC中是可以直接@Resource获取到对象的

4注解搭建SpringMVC 的环境

4.1web.xml还是一样的配置,同上

4.2配置SpringMVC的配置文件

<?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/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
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--扫描注解-->
    <context:component-scan base-package="com.test.controller"/>
    <!--注解驱动-->
    <!--配置了这个就有了HandlerMapping和HandlerAdapter-->
    <mvc:annotation-driven/>
    <!--静态资源自动放行,js/**表示js文件夹下的所有的文件和子文件夹里面文件-->
    <mvc:resources mapping="/js/**" location="/js/**"/>
</beans>

4.3Controller代码

@Controller
public class XXXController {
    @RequestMapping("xxx")
    public String xxx(){
        System.out.println("执行demo方法");
        return "a.jsp";
    }
}

这样子,浏览器访问http://localhost:8080/xxx,就可以进入到xxx()方法了。

5传参

比如前端会传进来2个值,name和age

    @RequestMapping("xxx")
    public String xxx(String name, int age){
        System.out.println("执行demo方法"+name+"--"+age);
        return "a.jsp";
    }

或者用一个pojo类接收,springmvc还会把name和age自动注入到pojo类里。同时还可以选择把name和age再接收到变量里面

    @RequestMapping("xxx")
    public String xxx(String name, int age, User user){
        System.out.println("执行demo方法"+name+"--"+age+"--"+user);
        return "a.jsp";
    }

如果前端传进来的变量的名称和接收方法的变量名称不一致,可以使用@RequestParam


如果需要传入的参数有默认值或者必传,也可以如下:


如果前端传进来的几个参数重名,可以如下:


前端传了好几个参数都叫hover,可以把他们放在list里面

还可以前端传“对象.属性”的参数,比如xx.yy
其实就是把接收的对象里面有一个XX类的对象xx,给xx的yy属性赋值。
比如有个User,User里面引用了xx对象,用User接收参数,这个参数会直接赋值给xx的yy属性。

6.转发方式

转发方式有请求转发和重定向两种,默认的是请求转发。

    @RequestMapping("xxx")
    public String demo( int age,String name){
        return "redirect:/a.jsp";//请求转发,默认
        return "forward:/a.jsp";//重定向
    }

7.自定义视图解析器(不写的话,SpringMVC有默认的)

之前的return是这样的:

return "/a.jsp";

在SpringMVC的配置文件上加上视图解析器:

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

之后的return就可以这样了:

return "a";

会自动前面加上/,后面加上.jsp

当指定了转发方式的时候(redirect:/a.jsp,forward:/a.jsp),这个自定义视图解析器就不起作用了,走默认的视图解析器。很好理解,因为再拼接前缀后缀就不对了。

8.@ResponseBody

在方法上面直接加@RequestMapping,无论返回什么,都是被认为要跳转的
给加上@ResponseBody,就不会跳转,而是把返回值转换为json串以输出流响应给客户端。(需要导包)

ps:这里可能会出现乱码问题:


解决乱码

相关文章

网友评论

    本文标题:SpringMVC

    本文链接:https://www.haomeiwen.com/subject/dvyoxqtx.html