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:这里可能会出现乱码问题:
解决乱码
网友评论