发表于: 2017-10-12 23:43:29

1 695


今日完成:

  学习Spring mvc注解使用

@Controller

在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用@RequestMapping 和@RequestParam 等一些注解用以定义URL 请求和Controller 方法之间的映射,这样的Controller 就能被外界访问到。此外Controller 不会直接依赖于HttpServletRequest 和HttpServletResponse 等HttpServlet 对象,它们可以通过Controller 的方法参数灵活的获取到。

@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器。单单使用@Controller 标记在一个类上还不能真正意义上的说它就是SpringMVC 的一个控制器类,因为这个时候Spring 还不认识它。那么要如何做Spring 才能认识它呢?这个时候就需要我们把这个控制器类交给Spring 来管理。有两种方式:

  (1)在SpringMVC 的配置文件中定义MyController 的bean 对象。

  (2)在SpringMVC 的配置文件中告诉Spring 该到哪里去找标记为@Controller 的Controller 控制器。

<!--配置方式1-->
<bean  class="cn.demo2.Second"></bean>
<!--配置方式2-->
<context:component-scan base-package="cn.demo2"></context:component-scan>

@RequestMapping

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

RequestMapping注解有六个属性,下面我们把她分成三类进行说明(下面有相应示例)。

1、 value, method;

value:     指定请求的实际地址;

method:  指定请求的method类型, GET、POST、PUT、DELETE等;

2、consumes,produces

consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;

produces:    指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

3、params,headers

params: 指定request中必须包含某些参数值是,才让该方法处理。

headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。

@Controller
public class Second {

@RequestMapping(value = "/hello")
public String hello(){
return "index";
}
}

@Resource和@Autowired

@Resource和@Autowired都是做bean的注入时使用,其具体区别下面这篇博文将的很好

http://blog.csdn.net/xiansky2015/article/details/50779862

因为暂时没有注入,配置视图解析器,测试

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>

@ResponseBody

作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;



基本了解后,学习最需要的接收参数,传递参数,页面跳转,页面重定向

①接受参数

简单一点通过HttpServletRequest接收

@RequestMapping(value="/hello")
public String hello(HttpServletRequest request){
String name = request.getParameter("name");
System.out.println(name);
return "index";
}

通过注解@RequestParam接受

@RequestMapping(value="/hello")
public String hello( @RequestParam("name") String name){
System.out.println(name);
return "index";
}

自动注入Bean属性

public class User {
private Integer id;
private String name;
public User() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

实体类写完后前台

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/hello" method="get">
<input type="text" name="id">
<input type="text" name="name">
<input type="submit" value="ss">
</form>
</body>
</html>

后台

@RequestMapping(value="/hello")
public String hello( User user){
System.out.println(user.getId());
System.out.println(user.getName());
return "index";
}

测试

这里user.id的值从String自动转换到Integer类,但如果User 添加了时间属性,那么从前台传递String到后台Date类不能自动转换,这里在

@Controller
public class Second

下注册一个自定义类型转换器!

@InitBinder
public void converterStringDate(WebDataBinder binder){
binder.registerCustomEditor(Date.class,
new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true));
}

测试成功

但是使用通过@DateTimeFormat来实现数据转换服务器400报错,接收数据失败


暂时跳过,

当前端传入2个对象时,且2个对象中出现了相同的属性名,那么就赋值时会造成同时赋值或相互覆盖,为了区分,这里采用包装模型来封装N个传入对象,那么在传入时就不会造成赋值混乱了.

与User相同的对象Emp

public class Emp {
private Integer id;
private String name;
private Date utime;

public Emp(){
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

public Date getUtime() {
return utime;
}
public void setUtime(Date utime) {
this.utime = utime;
}
}

包装模型

public class Bean {
private User user;
private Emp emp;

public Bean() {
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Emp getEmp() {
return emp;
}
public void setEmp(Emp emp) {
this.emp = emp;
}
}

前台

<body>
<form action="/hello" method="get">
<input type="text" name="user.id">
<input type="text" name="user.name">
<input type="text" name="user.utime">
<hr/>
<input type="text" name="emp.id">
<input type="text" name="emp.name">
<input type="text" name="emp.utime">
<input type="submit" value="ss">
</form>
</body>



这里开始测试传参,普通的HttpServletRequest.setAttribute,依旧可以使用ModelAndView.addObject 传递参数,但是使用该方式进行传递方法的返回值必须是ModelAndView,第三种,将数据绑定到Model对象中,使用Modle.addAttribute来传参.


最后是重定向和转发.

在返回值为String类型时,填写为完整跳转地址,不需要视图解析器的情况下,使用

public String hello(Bean bean, Model model){
   model.addAttribute("user",bean.getUser());
return "redirect:/index.jsp";
}

redirect:表示为重定向

public String hello(Bean bean, Model model){
   model.addAttribute("user",bean.getUser());
return "forward:/index.jsp";
}

forward:表示为转发且默认不写的情况下,都表示转发.

但这里同时有个问题,返回为非完整地址,在配合视图解析器下,类如

public String hello(Bean bean, Model model){
model.addAttribute("user",bean.getUser());
return "index";
}

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="forward:/"></property>
<property name="suffix" value=".jsp"></property>
</bean>

跳转为404 找不到页面报错!

还有就是传统的HttpServletRequest和HttpServletReponse两种类型,但是前提是方法没有返回值.


ssm框架整合中问题很多,目前但就整理好spring+mybatis,但在加入spring mvc测试服务器初始化失败,原因待查

明日计划:完成ssm整合,基础增删改查完成,步骤3-4完成

问题:ssm整合中,很多问题

收获:spring和mybatis整合原理理解较清晰



返回列表 返回列表
评论

    分享到