MVC思想,即”MOD:模型”,”VIEW”:”视图”,”CONTROL”:”控制”分离的思想,其中MOD层用于处理数据,包括业务算法,数据持久层等的实现;VIEW层用于为用户显示数据,比如JSP或html页面等;CONTROL层用于连接MOD层和VIEW层,包括封装数据,渲染数据等.三个部分以最小的耦合协同工作,是构建现代web应用的一个重要思想
Spring-MVC
1.结构
从一个web请求开始到数据被展示到页面上,在springmvc应用中经历了如下过程- 1.浏览器发起请求(携带请求数据)
- 2.DispatcherServlet(前端控制器)拦截请求
- 3.DispatcherServlet(前端控制器)查询控制器映射,将请求转发到对应的控制器
- 4.控制器处理请求,返回模型数据和要渲染的视图名到DispathcerServlet
- 5.DispatcherServlet使用视图解析器将逻辑视图名解析为一个实现
- 6.视图渲染数据,展示给用户
2.组件
1.DispatcherServlet(前端控制器)
用于处理springMVC应用中的请求,通过查询控制器映射将请求转发给控制器2.Controller(控制器)
用于处理请求中携带的信息(url,表单等)3.视图解析器
确定用于渲染模型的视图
3.配置
同依赖注入一样,springMVC项目中各个组件的配置方法也不只有一种,这里记录XML文件配置方法1.DispatcherServlet配置
实际上DispatcherServlet
的配置与普通的Servlet配置方法大同小异,都是要在Web.xml
中配置<Servlet>
和<Servlet-mapping>
标签,不同的是,在配置DispatcherServlet
的路径时,有以下几种格式- ”*.xxx”格式:
<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>*.do</url-pattern> </servlet-mapping>
当这样配置时,所有后缀为”*.xxx”的路径都会被
DispatcherServlet
拦截,对于其他路径则没有影响(例如html页面,图片,css,script资源等)“/”格式:
```xml <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> ```
对于这种配置方法,所有的路径都会被DispatcherServlet拦截,包括对于静态资源的访问,如果想要正常访问静态资源,必须在配置文件中对于静态资源访问进行配置
- ”*.xxx”格式:
Controller控制器的配置
1.开启组件扫描
在applicationContext.xml
或者Dispatcher对应的配置文件中加入<context:component-scan base-package="包名">
开启自动扫描
2.编写控制器
用@Controller
注解类用于声明一个控制器,用@RequestMapping("路径名")
来注解控制器类和方法
例如:
package Controller; import jdk.nashorn.internal.ir.RuntimeNode; import mod.Person; import net.sf.json.JSONObject; import org.springframework.context.annotation.ComponentScan; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.Errors; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; @Controller @RequestMapping("/") public class IndexController { @RequestMapping(value="hello.do",produces = "application/json; charset=utf-8") @ResponseBody public String getJson(HttpServletRequest request){ String name = request.getParameter("name"); String age = request.getParameter("age"); String body = request.getParameter("boy"); JSONObject obj = new JSONObject(); obj.put("name",name); obj.put("age",age); obj.put("boy",body); System.out.println(obj.toString()); return obj.toString(); } @RequestMapping(value="register.do",method = RequestMethod.GET,produces = "application/json;charset=utf-8") public String register(Model model){ model.addAttribute(new Person()); return "register"; } @RequestMapping(value="register.do",method = RequestMethod.POST,produces = "application/json;charset=utf-8") @ResponseBody public String register(Person person,Errors errors){ return person.getName(); } }
- 3.开启注解
在applicationContext.xml
或者Dispatcher对应的配置文件中加入
<mvc:annotation-driven/>
开启注解
ViewResolver视图解析器的配置
springMVC框架有多个视图解析器,这里使用InternalResourceViewResolver
解析器用于渲染jsp页面,在applicationContext.xml
或者Dispatcher对应的配置文件中加入<bean id="viewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/view/"/> <property name="suffix" value=".jsp"/> </bean>
配置视图解析器组件
结果展示
jsp页面如下<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %> <html> <head> <title>Title</title> <%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf"%> </head> <body> <sf:form method="POST" commandName="person"> Name: <sf:input path="name"/><br/> Age: <sf:input path="age"/><br/> Sex: <sf:input path="sex"/><br/> <input type="submit" value="Register"/> </sf:form> </body> </html>
提交表单后,数据被封装为一个Person类
package mod; import com.sun.istack.internal.NotNull; public class Person { public Person(String name, Integer age, String sex) { this.name = name; this.age = age; this.sex = sex; } public Person(){ } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @NotNull() private String name; @NotNull private Integer age; @NotNull private String sex; }