MVC是一种软件设计规范,不是设计模式,是架构模式。
Model(模型):dao,service
View(视图):jsp
Controller(控制器):servlet
控制器Controller
- 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现。
- 控制器负责解析用户的请求并将其转换为一个模型。
- 在SpringMVC中一个控制器类可以包含多个方法。
- 在SpringMVC中,对于Controller的配置方式有很多种。
实现Controller的方法:
1.实现Controller接口
Controller是一个接口,在org.springframework.web.servlet.mvc包下,接口中只有一个方法。
//实现该接口的类可以获得控制器功能
public class ControllerDemo1 implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv = new ModelAndView();
//添加数据
mv.addObject("msg","welcome");
//视图跳转
mv.setViewName("test");
return mv;
}
}
2.使用注解Controller
@Controller注解类型用于声明Spring类的实例是一个控制器;
Spring可以使用扫机制来找到应用程序中所有基于注解的控制器类,为了保证Spring能找到你的控制器,需要在配置文件中组件扫描。
<!--自动扫描指定的包,下面所有注解类交给IOC容器管理-->
<context:component-scan base-packge="com.kuang.controller"/>
@Controller//代表这个类会被spring接管,被这个注解类中的所有方法,如果返回值是String,并且有具体的页面可以跳转,那么就会被视图解析器解析
public class ControllerDemo2 {
@RequestMapping("/t2")
public String test1(Model model){
model.addAttribute("msg","demo2");
return "test";//WEB-INF/jsp/test.jsp
}
}
RequestMapping
- @RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法。可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
假设有一下情况,在某一个控制类中,代码如下:
@Controller
public class ControllerDemo2 {
@RequestMapping("/t2")
public String test1(Model model){
model.addAttribute("msg","demo2");
return "test";
}
}
此时已经映射为t2;
又有一个类,代码如下:
@Controller
@RequestMapping("/c3")
public class ControllerDemo3 {
@RequestMapping("/t2")
public String test1(Model model){
model.addAttribute("msg","demo3");
return "test";
}
}
则此时访问localhost:8080/t2,访问的应该是demo2中的结果。因为第二个类中的RequestMapping存在了父子关系,若要访问该t2,路径应为localhost:8080/c3/t2;
RestFul 风格
RestFul就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格的设计软件可以更简洁,更有层次,更易于实现缓存等机制。
其功能为:
- 资源:互联网所有的事务都可以被抽象为资源。
- 资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。
- 分别对应添加、删除、修改、查询
处理提交数据
1.提交域名称和处理方法的参数名一致(域名里的name,和方法中的参数name一致)
提交数据:http://localhost:8080/hello?name=daitu
处理方法:
@RequestMapping("/hello")
public String hello(string name){
System.out.println(name);
return "hello";
}
后台输出:daitu
2.提交的域名称和处理方法的参数名不一样
提交数据:http://localhost:8080/hello?username=daitu
处理方法:
//@RequestParam("username") username提交的域的名称
@RequestMapping("/hello")
public String hello(@RequestParam("username") string name){
System.out.println(name);
return "hello";
}
后台输出:daitu
3.提交的是一个对象
要求提交的表单域和对象的属性名一致,参数使用对象即可
1.实体类
public class User{
private int id;
private String name;
private int age;
//构造
//get set
//tostring()
}
2.提交数据:
htttp://localhost8080/mvc04/user?name=daitu&id=10&age=15
3.处理方法
@RequestMapping("/user")
public String user(User user){
System.out.println(user);
retunrn "hello";
}
后台输出:User{id=10,name=‘daitu’,age=15}
如果使用对象的话,前端传递的参数名必须一致,否则就是null
数据显示到前端
1.通过ModelAndView
public class ControllerTest1 implements Controller{
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv = new ModelAndView();
//添加数据
mv.addObject("msg","welcome");
//视图跳转
mv.setViewName("test");
return mv;
}
}
2.通过Model
@RequestMapping("/ct2/hello")
public String hello(@RequestPara("username") String name,Model model){
//封装要显示到视图的数据
//相当于req.setAttribute("name",name);
model.addAttribute("msg",name);
System.out.println(name);
return "test";
}
3.通过ModelMap
@RequestMapping("/hello")
public String hello(@RequestPara("username") String name,ModelMap model){
//封装要显示到视图的数据
//相当于req.setAttribute("name",name);
model.addAttribute("name",name);
System.out.println(name);
return "hello";
}
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>