什么是SpringMVC
首先来说说什么是MVC,web项目执行的流程是用户发送一个请求,如何解析用户的输入,执行相关的逻辑,跳转页面,这就需要控制层Controller来完成,在请求的过程中,数据被封装在domain对象中,这个对象就是数据模型层Model,在请求返回页面这个即使视图层View
SpringMVC就是一个连接用户视图,控制器,数据模型层的一个轻量级web框架,其目的是将web的开发模块化
SpringMVC的请求流程
1.用户发起一个request请求,此请求会被前端控制器处理(DispatcherServlet)
2.前端控制器(DispatcherServlet)请求处理器映射器(HandlerMapping)去查找Handler,可以一句注解或xml的配置去查找
3.处理器映射器(HandlerMapping)根据配置找到相应的Handler,返回给前端控制器(DispatcherServlet)
4.前端控制器(DispatcherServlet)请求处理器适配器(HandlerAdapter)去执行相应的Handler(Controller)
5.处理器适配器(HandlerAdapter)执行Handler
6.Handler执行完毕返回给处理器适配器(HandlerAdapter)一个ModelAndView
7.处理器适配器(HandlerAdapter)接受到Handler返回的ModelAndView后,将其返回给前端控制器(DispatcherServlet)
8.前端控制器(DispatcherServlet)接受到ModelAndView后,会请求视图解析器(View Resolver)对视图进行解析
9.视图解析器(View Resolver)根据View信息匹配到相应的视图结果,反馈给前端控制器前端控制器(DispatcherServlet)
10.前端控制器(DispatcherServlet)接受到View具体视图后,进行视图渲染,将Model中的模型数据填充到View视图中的request域,生成最终的视图(View)
11.前端控制器(DispatcherServlet)向用户返回请求结果
怎么使用
1.在web.xml中配置DisapatcherServlet
<!-- 配置dispatherservlet -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
在web.xml中配置了DispatcherServlet,web启动就会找xxx-servlet.xml文件,没有配置这个文件会报错
可以在web.xml自定义xxx-servlet.xml的文件名,文件位置
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
2.接下来就是编写核心配置文件xxx-servlet.xml
这个核心置文件就是配置前面流程中的各个组件
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com.crc.." />
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
<!-- 配置handlermapping -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
<!-- 配置handleradapertor -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
<!-- 配置ModelAndView -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsps/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
这里context:component-scan base-package=”com.crc..” 和org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping/org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter是用注解的配置,在service代码中可以加上@Controller代表这个类是控制器,不然需要做以下的配置
<!-- 配置controller -->
<bean name="/hello.do" class="com.crc.controller.LoginController">
</bean>
3.我们可以用注解的方式了解以下简单的登陆操作
登陆的jsp
<body class="body">
<div class="context" >
<div class="form">
<h1>用户登陆</h1>
<form action="login.do" method="post" id="loginform" onsubmit="return validate()">
<table>
<tr><td>用户名:</td><td><input type="text" id="name" name="name" fs="请输入用户名"></td></tr>
<tr><td>密码:</td><td><input type="password" id="password" name="password" fs="请输入密码"></td></tr>
</table>
<input class="login-button" type="submit" value="登录">
<a href="toregister.do"><input type="button" class="login-button" value="注册"></a>
</form>
</div>
</div>
</body>
Controller
@Controller
public class LoginController{
@Autowired
private UsersService usersService;
@RequestMapping("/login.do")
public String Login(Users users,Model model,HttpServletRequest request){
Users u=usersService.get(users.getName());
System.out.println("1===="+u);
if (u==null) {
model.addAttribute("errorMsg", "用户名错误");
return "login";
}else if(u.getPassword().equals(users.getPassword())){
request.getSession().setAttribute("user", u);
return "main";
}else
model.addAttribute("errorMsg", "密码错误");
return "login";
}
}
因为上面配置了自动扫描,当DispatcherServlet
接受到request请求login.do,就会请求HandlerAdapter找到@Controller里面的@RequestMapping(“/login.do”)的方法,
完成逻辑处理再返回信息给DispatcherServlet,返回的是main,则通过这段代码
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsps/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
拼接成/WEB-INF/jsps/main.jsp,再这个路径下找到jsp界面,返回给用户
4.页面乱码问题
我们可以再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>