一,什么是MVC
MVC是模型(model),视图(view),控制器(controller)的简写,是一种软件设计规范。
是将业务逻辑、数据、显示分离的方法来组织代码。
MVC主要作用是降低了视图与业务逻辑间的双向耦合。
MVC不是一种设计模式,MVC是一种架构模式。
Model:数据模型,提供要展示的数据,因此包含数据和行为。
View:负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
Controller:接收用户请求,委托给模型进行处理,处理完毕后把返回的模型数据返回给视图,由视图负责展示。
二,DispatcherServlet的工作原理
DispatcherServlet首先会接收到用户的请求并进行拦截,通过HandlerMapping处理器映射,找到对应的handler,然后通过HandlerExecution
根据url查找控制器,将解析得到后的信息传递给DispatcherServlet,然后DispatcherServlet将信息传递给处理器适配器HandlerAdapter,按照
特定的规则去执行handler,handler让具体的controller执行。处理器调用业务层并返回信息给前端控制器,然后前端控制器DispatcherServlet
通过视图解析器解析传来的逻辑视图名,并将数据进行渲染,然后将视图传递给用户。
三,JSON
json是一种轻量级的数据交换格式,目前使用特别广泛。采用完全独立于编程语言的文本格式来存储和表示数据。
简洁和清晰的层次结构使得json成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效的提升网络传输效率。
JSON的使用方法:
//1,先创建一个ObjectMapper对象
ObjectMapper mapper = new ObjectMapper();
//2,再用ObjectMapper对象将目标转化为字符串
String str = mapper.writeValueAsString(user);
四,springMVC中的注解
1,@Controller
@Controller注解类型用于声明Spring类的实例是一个控制器
注意:为了保证Spring能找到你的控制器,需要在配置文件中声明组件扫描
<!-- 自动扫描指定的包,下面所有注解类交给IOC容器管理 -->
<context:component-scan base-package="com.kuang.controller"/>
2,@RequestMapping
@RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法。可用于类或方法上。
给用户一个访问地址。
3,@RequestParam
用于指定获取数据的域名称
4,@ResponseBody
标注一个类不会走视图解析器,会直接返回一个字符串。
五,springMVC中的结果跳转方式和数据处理
1,结果跳转方式
a,通过设置ModelAndView对象,根据view的名称和视图解析器跳到指定的页面。
@RequestMapping("/hello1")
public String hello(Model model){
//封装数据
model.addAttribute("msg","hello,springmvc");
return "hello"; //会被视图解析器处理
}
视图解析器:
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
b,通过设置servlet相关参数实现跳转
@Controller
public class ResultGo {
@RequestMapping("/result/t1")
public void test1(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
rsp.getWriter().println("Hello,Spring BY servlet API");
}
@RequestMapping("/result/t2")
public void test2(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
rsp.sendRedirect("/index.jsp");
}
@RequestMapping("/result/t3")
public void test3(HttpServletRequest req, HttpServletResponse rsp) throws Exception {
//转发
req.setAttribute("msg","/result/t3");
req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,rsp);
}
}
c,通过SpringMVC来实现转发和重定向
@RequestMapping("/m1/t2")
public String test2(Model model){
model.addAttribute("msg","modeltest1");
//转发
return "/WEB-INF/jsp/hello.jsp";
}
@RequestMapping("/m1/t3")
public String test3(Model model){
model.addAttribute("msg","modeltest2");
//转发
return "forward:/WEB-INF/jsp/hello.jsp";
}
@RequestMapping("/m1/t4")
public String test4(Model model){
model.addAttribute("msg","modeltest1");
//重定向
return "redirect:/index.jsp";
}
2,数据处理
a,提交的域名称和处理方法的参数名一致
提交数据:
http://localhost:8080/hello?name=lll
可以直接获得name中的数据并打印
@RequestMapping("/hello")
public String hello(String name){
System.out.println(name);
return "hello";
}
b,提交的域名称和处理方法的参数名不一致
提交数据:
http://localhost:8080/hello?username=kuangshen
获取数据:
//@RequestParam("username") : username提交的域的名称 .
@RequestMapping("/hello")
public String hello(@RequestParam("username") String name){
System.out.println(name);
return "hello";
}
c,提交的是一个对象时
要求提交数据的时候都与对象的属性名一致,否则匹配不到
http://localhost:8080/mvc04/user?name=lll&id=1&age=15
六,SpringMVC中的乱码处理
spring中提供了一个过滤器类来处理乱码问题,直接在web工程的配置文件中配置即可。
<!-- 配置springmvc的乱码过滤-->
<filter>
<filter-name>encoding</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>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>