Spring MVC学习路(三) 编写第一个demo

新建包com.test里面新建Test.java文件
html

package com.test;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class Test {
	@RequestMapping("test") //表示访问地址
	public String test1(){
		System.out.println("load");
		return "demo" ; 
	}
}

在上述视图解析器中,若是Controller返回的是blog/index,那么经过视图解析器解析以后的视图就是/demo.jsp。java

@Controller:用于标识是处理器类;web

@RequestMapping:请求处处理器功能方法的映射规则;spring

@RequestParam:请求参数处处理器功能处理方法的方法参数上的绑定;session

@ModelAttribute:请求参数到命令对象的绑定;app

@SessionAttributes:用于声明session级别存储的属性,放置在处理器类上,一般列出jsp

模型属性(如@ModelAttribute)对应的名称,则这些属性会透明的保存到session中;ui

@InitBinder:自定义数据绑定注册支持,用于将请求参数转换到命令对象属性的对应类型;url

更详细的说明来源于:http://www.cnblogs.com/superjt/p/3309255.htmlspa

package controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import entity.User;

@Controller  //相似Struts的Action
public class TestController {

    @RequestMapping("test/login.do")  // 请求url地址映射,相似Struts的action-mapping
    public String testLogin(@RequestParam(value="username")String username, String password, HttpServletRequest request) {
        // @RequestParam是指请求url地址映射中必须含有的参数(除非属性required=false)
        // @RequestParam可简写为:@RequestParam("username")

        if (!"admin".equals(username) || !"admin".equals(password)) {
            return "loginError"; // 跳转页面路径(默认为转发),该路径不须要包含spring-servlet配置文件中配置的前缀和后缀
        }
        return "loginSuccess";
    }

    @RequestMapping("/test/login2.do")
    public ModelAndView testLogin2(String username, String password, int age){
        // request和response没必要非要出如今方法中,若是用不上的话能够去掉
        // 参数的名称是与页面控件的name相匹配,参数类型会自动被转换
        
        if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {
            return new ModelAndView("loginError"); // 手动实例化ModelAndView完成跳转页面(转发),效果等同于上面的方法返回字符串
        }
        return new ModelAndView(new RedirectView("../index.jsp"));  // 采用重定向方式跳转页面
        // 重定向还有一种简单写法
        // return new ModelAndView("redirect:../index.jsp");
    }

    @RequestMapping("/test/login3.do")
    public ModelAndView testLogin3(User user) {
        // 一样支持参数为表单对象,相似于Struts的ActionForm,User不须要任何配置,直接写便可
        String username = user.getUsername();
        String password = user.getPassword();
        int age = user.getAge();
        
        if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {
            return new ModelAndView("loginError");
        }
        return new ModelAndView("loginSuccess");
    }

    @Resource(name = "loginService")  // 获取applicationContext.xml中bean的id为loginService的,并注入
    private LoginService loginService;  //等价于spring传统注入方式写get和set方法,这样的好处是简洁工整,省去了没必要要得代码

    @RequestMapping("/test/login4.do")
    public String testLogin4(User user) {
        if (loginService.login(user) == false) {
            return "loginError";
        }
        return "loginSuccess";
    }
}

以上4个方法示例,是一个Controller里含有不一样的请求url,也能够采用一个url访问,经过url参数来区分访问不一样的方法,代码以下:

package controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/test2/login.do")  // 指定惟一一个*.do请求关联到该Controller
public class TestController2 {
    
    @RequestMapping
    public String testLogin(String username, String password, int age) {
        // 若是不加任何参数,则在请求/test2/login.do时,便默认执行该方法
        
        if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {
            return "loginError";
        }
        return "loginSuccess";
    }

    @RequestMapping(params = "method=1", method=RequestMethod.POST)
    public String testLogin2(String username, String password) {
        // 依据params的参数method的值来区分不一样的调用方法
        // 能够指定页面请求方式的类型,默认为get请求
        
        if (!"admin".equals(username) || !"admin".equals(password)) {
            return "loginError";
        }
        return "loginSuccess";
    }
    
    @RequestMapping(params = "method=2")
    public String testLogin3(String username, String password, int age) {
        if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {
            return "loginError";
        }
        return "loginSuccess";
    }
}

其实RequestMapping在Class上,可看作是父Request请求url,而RequestMapping在方法上的可看作是子Request请求url,父子请求url最终会拼起来与页面请求url进行匹配,所以RequestMapping也能够这么写:

package controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/test3/*")  // 父request请求url
public class TestController3 {

    @RequestMapping("login.do")  // 子request请求url,拼接后等价于/test3/login.do
    public String testLogin(String username, String password, int age) {
        if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {
            return "loginError";
        }
        return "loginSuccess";
    }
}
相关文章
相关标签/搜索