在聊SpringMVC之前,我们先来说一下Servlet。早先的Web应用通过Servlet拦截客户端向服务端发送请求并处理,但是这种模式存在很多的缺点:
1、每编写一个Servlet都需要编写8行配置文件;
2、每个Servlet的入口方法只有一个,只能处理一个业务.如果处理多个业务必须编写多个Servlet;
3、servlet获取参数时,必须一个一个的获取.并且参数类型必须手动转化。
SpringMVC通过配置文件直接拦截所有带有特定后缀的请求,使开发更加简单方便,因此SpringMVC逐渐登上Web开发的舞台,至今仍被广泛应用。
SpringMVC组件介绍:
1、前端控制器(DispatcherServlet):它的主要功能是转发请求和响应;
2、处理器映射器:根据用户提交的url,找到能够对应的Controller进行处理;
3、处理器适配器:根据特定的规则执行用户的请求;
4、视图解析器:将用户返回的页面名称,自动拼接为具体页面路径。
SpringMVC调用过程:
步骤:
1.客户端发送请求:localhost:8080/项目名/hello.action,发送给前端控制器;
2.前端控制请求处理器映射器,查询能够处理该请求的Controller;
3.将找到的Controller路径返回给前端控制器;
4.请求处理器适配器找到合适的处理器.处理请求;
5.处理器适配器找到合适的处理器.执行请求代码.(controller-service-dao);
6.将处理后的结果和响应页面封装到ModelAndView对象中,返回给处理器适配器;
7.将ModelAndView对象返回给前端控制器;
8.请求视图解析器帮助解析View对象,到底是哪个页面;
9.视图解析器内部拼接.将页面名称拼接成真实的页面路径,返回给前端控制器;
10.将数据填充到页面中,该过程叫做视图渲染,之后返回给用户进行呈现。
配置实例:
1、在web容器中(web.xml)配置前端控制器:
<!-- springmvc配置 -->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/spring-*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/Websocket/*</url-pattern>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
2、配置springmvc
<!-- 注解扫描包 -->
<context:component-scan base-package="my018">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Service" />
</context:component-scan>
<!-- 启动注解驱动的Spring MVC功能,注册请求url和注解POJO类方法的映射 -->
<mvc:annotation-driven>
<!-- 视图模型的解析,在视图模型前后端添加后缀,返回的页面类型属于怎样的 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".html"></property>
</bean>
3、编写Controller并加上@Controller注解
@Controller
@RequestMapping("User")
public class UserController {
@Autowired
private UserService userService;
//登录
@RequestMapping("login")
@ResponseBody
public RResult login(String uname,String upwd){
System.out.println(uname+"___"+upwd);
RResult result;
try{
System.out.println(uname+":"+upwd);
userService.login(uname,upwd);
result = new RResult("ok");
System.out.println(result);
return result;
}catch(PPException e){
result = new RResult("ng");
return result;
}
}
这样,当你发送登录请求*/User/login.do时就会直接被SpringMVC拦截并处理。如有用词或者逻辑上的误区,还望指正。