关于MVC的学习经验

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值