文档描述
第第3 3章章 Spring MVCSpring MVC的的ControllerController主要内容主要内容 基于注解的控制器基于注解的控制器 Controller Controller接收请求参数的方式接收请求参数的方式 重定向和转发重定向和转发 应用应用AutowiredAutowired进行依赖注入进行依赖注入 ModelAttribute ModelAttribute3.1 3.1 基于注解的控制器基于注解的控制器3.1.1 Controller3.1.1 Controller注解类型注解类型3.1.2 RequestMapping3.1.2 RequestMapping注解类型注解类型3.1.3 3.1.3 编写请求处理方法编写请求处理方法3.1.1 Controller3.1.1 Controller注解类型注解类型 在在Spring MVCSpring MVC中,使用中,使用org.springframework.stereotype.Controllerorg.springframework.stereotype.Controller注解类型声明某注解类型声明某类的实例是一个控制器。例如,类的实例是一个控制器。例如,2.2.42.2.4节中的节中的IndexControllerIndexController控控制器类。别忘了在制器类。别忘了在Spring MVCSpring MVC的配置文件中使用的配置文件中使用元素(见【例元素(见【例2-12-1】)或在】)或在Spring Spring MVCMVC配置类中使用配置类中使用ComponentScanComponentScan注解(见【例注解(见【例2-22-2】)指定控制】)指定控制器类的基本包,进而扫描所有注解的控制器类。器类的基本包,进而扫描所有注解的控制器类。3.1.2 RequestMapping3.1.2 RequestMapping注解类型注解类型1 1方法级别注解方法级别注解2 2类级别注解类级别注解1 1方法级别注解方法级别注解Controllerpublic class IndexController RequestMapping(value=/index/login)public String login()/*login代表逻辑视图名称,需要根据Spring MVC配置中*internalResourceViewResolver的前缀和后缀找到对应的物理视图*/return login;RequestMapping(value=/index/register)public String register()return register;2 2类级别注解类级别注解ControllerRequestMapping(/index)public class IndexController RequestMapping(/login)public String login()return login;RequestMapping(/register)public String register()return register;3.1.3 3.1.3 编写请求处理方法编写请求处理方法1 1请求处理方法中常出现的参数类型请求处理方法中常出现的参数类型2 2请求处理方法常见的返回类型请求处理方法常见的返回类型1 1请求处理方法中常出现的参数类型请求处理方法中常出现的参数类型 如果需要在请求处理方法中使用如果需要在请求处理方法中使用Servlet APIServlet API类型,那么可类型,那么可以将这些类型作为请求处理方法的参数类型。除了以将这些类型作为请求处理方法的参数类型。除了Servlet APIServlet API参数类型外,还有输入输出流、表单实体类、注解类型、与参数类型外,还有输入输出流、表单实体类、注解类型、与SpringSpring框架相关的类型等框架相关的类型等。但特别重要的类型是但特别重要的类型是org.springframework.ui.Modelorg.springframework.ui.Model类型,该类型是一个包含类型,该类型是一个包含MapMap的的SpringSpring框架类型。每次调用请求处理方法时,框架类型。每次调用请求处理方法时,Spring MVCSpring MVC都将都将创建创建org.springframework.ui.Modelorg.springframework.ui.Model对象。对象。public String register(Model model)/*在视图中可以使用EL表达式$success取出model中的值,有关EL相关知识,请参考本书有关内容。*/model.addAttribute(success,注册成功注册成功);return register;2 2请求处理方法常见的返回类型请求处理方法常见的返回类型 最常见的返回类型,就是代表逻辑视图名称的最常见的返回类型,就是代表逻辑视图名称的StringString类型类型,如前面章节中的请求处理方法。除了,如前面章节中的请求处理方法。除了StringString类型类型外,还有外,还有ModelModel、ViewView以及其他任意的以及其他任意的JavaJava类型类型。主要内容主要内容 基于注解的控制器基于注解的控制器 Controller Controller接收请求参数的方式接收请求参数的方式 重定向和转发重定向和转发 应用应用AutowiredAutowired进行依赖注入进行依赖注入 ModelAttribute ModelAttribute3.2 Controller3.2 Controller接收请求参数的常见方式接收请求参数的常见方式3.2.1 3.2.1 通过实体通过实体BeanBean接收请求参数接收请求参数3.2.2 3.2.2 通过处理方法的形参接收请求参数通过处理方法的形参接收请求参数3.2.3 3.2.3 通过通过HttpServletRequestHttpServletRequest接收请求参数接收请求参数3.2.4 3.2.4 通过通过PathVariablePathVariable接收接收URLURL中的请求参数中的请求参数3.2.5 3.2.5 通过通过RequestParamRequestParam接收请求参数接收请求参数3.2.6 3.2.6 通过通过ModelAttributeModelAttribute接收请求参数接收请求参数3.2.1 3.2.1 通过实体通过实体BeanBean接收请求参数接收请求参数 Bean Bean的属性名称必须与请求参数名称相同。的属性名称必须与请求参数名称相同。【例例3-13-1】通过实体】通过实体BeanBean接收请求参数。应用接收请求参数。应用ch3_1ch3_1的具体的具体要求是:通过应用程序的主页要求是:通过应用程序的主页index.jspindex.jsp的超链接,进入注册页的超链接,进入注册页面面register.jspregister.jsp和登录页面和登录页面login.jsplogin.jsp,注册成功跳转到登录页,注册成功跳转到登录页面,登录成功跳转到主页面面,登录成功跳转到主页面main.jspmain.jsp。注册页面表单注册页面表单姓名:密码:确认密码:BeanBean类类public class UserForm private String uname;/与请求参数名称相同private String upass;private String reupass;/省略getter和setter方法控制器方法控制器方法/*处理注册*使用 UserForm对象(实体Bean)user接收注册页面提交的请求参数 */RequestMapping(/register)public String register(UserForm user,Model model)if(zhangsan.equals(user.getUname()&123456.equals(user.getUpass()logger.info(成功);return login;/注册成功,跳转到login.jspelselogger.info(失败);/在register.jsp页面上可以使用EL表达式取出model的uname值model.addAttribute(uname,user.getUname();return register;/返回register.jsp3.2.2 3.2.2 通过处理方法的形参接收请求参数通过处理方法的形参接收请求参数RequestMapping(/register)/*通过形参接收请求参数,形参名称与请求参数名称完全相同*/public String register(String uname,String upass,Model model)if(zhangsan.equals(uname)&123456.equals(upass)logger.info(成功);return login;/注册成功,跳转到login.jspelselogger.info(失败);/在register.jsp页面上可以使用EL表达式取出model的uname值model.addAttribute(uname,uname);return register;/返回register.jsp3.2.3 3.2.3 通过通过HttpServletRequestHttpServletRequest接收请求参数接收请求参数RequestMapping(/register)/*通过HttpServletRequest接收请求参数*/public String register(HttpServletRequest request,Model model)String uname=request.getParameter(uname);String upass=request.getParameter(upass);if(zhangsan.equals(uname)&123456.equals(upass)logger.info(成功);return login;/注册成功,跳转到login.jspelselogger.info(失败);/在register.jsp页面上可以使用EL表达式取出model的uname值model.addAttribute(uname,uname);return register;/返回register.jsp3.2.4 3.2.4 通过通过PathVariablePathVariable接收接收URLURL中的请求参数中的请求参数RequestMapping(value=/register/uname/upass,method=RequestMethod.GET)/必须加method属性/*通过PathVariable获取URL中的参数*/public String register(PathVariable String uname,PathVariable String upass,Model model)if(zhangsan.equals(uname)&123456.equals(upass)return login;/注册成功,跳转到login.jspelse/在register.jsp页面上可以使用EL表达式取出model的uname值model.addAttribute(uname,uname);return register;/返回register.jsphttp:/localhost:8080/ch3_1/user/register/zhangsan/1234563.2.5 3.2.5 通过通过RequestParamRequestParam接收请求参数接收请求参数RequestMapping(/register)/*通过RequestParam接收请求参数*/public String register(RequestParam String uname,RequestParam String upass,Model model)if(zhangsan.equals(uname)&123456.equals(upass)logger.info(成功);return login;/注册成功,跳转到login.jspelselogger.info(失败);/在register.jsp页面上可以使用EL表达式取出model的uname值model.addAttribute(uname,uname);return register;/返回register.jsp3.2.6 3.2.6 通过通过ModelAttributeModelAttribute接收请求参数接收请求参数RequestMapping(/register)public String register(ModelAttribute(user)UserForm user)if(zhangsan.equals(user.getUname()&123456.equals(user.getUpass()logger.info(成功);return login;/注册成功,跳转到login.jspelselogger.info(失败);/使用ModelAttribute(user)与model.addAttribute(user,user)功能相同/在register.jsp页面上可以使用EL表达式$user.uname取出ModelAttribute的uname值return register;/返回register.jsp主要内容主要内容 基于注解的控制器基于注解的控制器 ControllerController接收请求参数的方式接收请求参数的方式 重定向和转发重定向和转发 应用应用AutowiredAutowired进行依赖注入进行依赖注入 ModelAttribute ModelAttribute3.3 3.3 重定向与转发重定向与转发转发是服务器行为转发是服务器行为,重定向是客户端行为重定向是客户端行为。ControllerRequestMapping(/index)public class IndexController RequestMapping(/login)public String login()/转发到一个请求方法(同一个控制器类里,可省略/index/)return forward:/index/isLogin;RequestMapping(/isLogin)public String isLogin()/重定向到一个请求方法return redirect:/index/isRegister;RequestMapping(/isRegister)public String isRegister()/转发到一个视图return register;主要内容主要内容 基于注解的控制器基于注解的控制器 ControllerController接收请求参数的方式接收请求参数的方式 重定向和转发重定向和转发 应用应用AutowiredAutowired进行依赖注入进行依赖注入 ModelAttribute ModelAttribute3.4 3.4 应用应用AutowiredAutowired进行依赖注入进行依赖注入 Spring MVC Spring MVC框架可以通过框架可以通过org.springframework.beans.factory.annotation.org.springframework.beans.factory.annotation.AutowiredAutowired注解类型将依赖注入到一个属性(成员变量)或方法,如:注解类型将依赖注入到一个属性(成员变量)或方法,如:AutowiredAutowiredpublic UserService userServicepublic UserService userService;在在Spring MVCSpring MVC中,为了能被作为依赖注入,实现类必须中,为了能被作为依赖注入,实现类必须使用使用org.springframework.stereotype.Serviceorg.springframework.stereotype.Service注解类型注明注解类型注明为为ServiceService(一个服务)。另外,还需要在配置文件中使用(一个服务)。另外,还需要在配置文件中使用context:component-scan base-package=/元素或者元素或者在配置类中使用在配置类中使用ComponentScan(ComponentScan(基本包基本包)注解来扫描依赖基注解来扫描依赖基本包。将【例本包。将【例3-13-1】的】的ch3_1ch3_1应用的应用的“登录登录”和和“注册注册”的业务的业务逻辑处理分离出来,使用逻辑处理分离出来,使用ServiceService层层实现。实现。主要内容主要内容 基于注解的控制器基于注解的控制器 ControllerController接收请求参数的方式接收请求参数的方式 重定向和转发重定向和转发 应用应用AutowiredAutowired进行依赖注入进行依赖注入 ModelAttribute ModelAttribute3.5 ModelAttribute3.5 ModelAttribute1 1绑定请求参数到实体对象(表单的命令对象)绑定请求参数到实体对象(表单的命令对象)2 2注解一个非请求处理方法注解一个非请求处理方法1 1绑定请求参数到实体对象(表单的命令对绑定请求参数到实体对象(表单的命令对象)象)RequestMapping(/register)public String register(ModelAttribute(user)UserForm user)if(zhangsan.equals(user.getUname()&123456.equals(user.getUpass()return login;elsereturn register;2 2注解一个非请求处理方法注解一个非请求处理方法 在控制器类中,被在控制器类中,被ModelAttributeModelAttribute注解的一个非请求处理注解的一个非请求处理方法,将在每次调用该控制器类的请求处理方法前被调用。方法,将在每次调用该控制器类的请求处理方法前被调用。public class BaseController ModelAttribute public void isLogin(HttpSession session)throws Exception if(session.getAttribute(user)=null)throw new Exception(没有权限);ControllerRequestMapping(/admin)public class ModelAttributeController extends BaseController ModelAttributeController ModelAttributeController类中的类中的addadd、updateupdate、deletedelete请求处理方法请求处理方法执行时,首先执行父类执行时,首先执行父类BaseControllerBaseController中的中的isLoginisLogin方法判断登录权限。方法判断登录权限。
展开阅读全文