Java Web编程技术 课件 第10章SpringMVC入门_第1页
Java Web编程技术 课件 第10章SpringMVC入门_第2页
Java Web编程技术 课件 第10章SpringMVC入门_第3页
Java Web编程技术 课件 第10章SpringMVC入门_第4页
Java Web编程技术 课件 第10章SpringMVC入门_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JavaWeb编程技术本章首先介绍SpringMVC的处理流程,然后介绍控制器和请求处理方法的编写,最后介绍请求参数以及几个常用注解的使用。SpringMVC体系结构控制器与请求处理方法请求参数接收的方式常用注解的使用第10章SpringMVC入门SpringMVC是Web应用的表示层提供的一个优秀MVC框架。与其他众多的Web框架一样,SpringMVC基于MVC设计理念,采用了松散耦合、可插拔的组件结构,比其他MVC框架更具有可扩展性和灵活性。SpringMVC体系结构SpringMVC是基于模型2实现的技术框架,模型2是经典的MVC模型,利用处理器分离模型、视图和控制,以便达到不同层之间松散耦合的效果,提供系统的可重用性、维护性和灵活性。SpringMVC不需要实现任何接口,它通过一套MVC注解让POJO成为处理请求的控制器,且在数据绑定、视图解析、本地化处理及静态资源处理上都有许多不俗的表现。10.1.1SpringMVC处理流程10.1.2DispatcherServlet类10.1SpringMVC处理流程10.1.1SpringMVC框架的核心是DispatcherServlet,它负责拦截请求并将其分派给相应的处理器处理。SpringMVC框架处理用户请求的过程模型如图10-1所示。SpringMVC处理流程10.1.1(1)用户在客户端发出一个HTTP请求,Web容器接收该请求,如果该请求与web.xml中DispatcherServlet的请求映射路径匹配,容器则将该请求转交给DispatcherServlet处理,它将查找HandlerMapping处理器映射,调用合适的控制器Controller。(2)控制器Controller根据请求URL及GET或POST方法调用合适的业务方法对请求进行处理。在业务方法中设置模型数据,并基于定义的业务逻辑向DispatcherServlet返回视图名。(3)DispatcherServlet在视图解析器ViewResolver的帮助下选择为该请求定义的视图。(4)一旦视图完成,DispatcherServlet将模型数据传递给视图,这些数据最终显示在浏览器中。DispatcherServlet类在SpringMVC中,对Web应用的设计是围绕DispatcherServlet进行,它是一个前端控制器,它将请求分发到Controller控制器。DispatcherServlet是SpringMVC的入口,与任何Servlet一样,必须在部署描述文件web.xml中配置后才能起作用。<servlet><servlet-name>springmvc</servlet-name><servlet-class>

org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name>

<url-pattern>/</url-pattern></servlet-mapping>10.1.2DispatcherServlet类

当DispatcherServlet初始化时,它将在应用程序的WEB-INF目录下寻找一个配置文件,该文件命名规则如下:servletName-servlet.xml

其中,servletName是部署描述文件中DispatcherServlet的名称。如果这个Servlet名称为springmvc,则配置文件名应该为springmvc-servlet.xml,这里的springmvc是DispatcherServlet在<servlet-name>元素中配置的名称。

也可以把SpringMVC的配置文件存放在应用的任何目录中,只要告诉DispatcherServlet如何找到它即可。这只需在<servlet>声明中使用<init-param>元素定义一个参数即可,参数名为contextConfigLocation,参数值指定配置文件的路径。例如,下面代码将默认的配置文件名和路径改为/WEB-INF/config/sample-config.xml。10.1.2<servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--配置初始化参数--><init-param><!--加载SpringMVC的xml到Spring的上下文容器中--><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/config/sample-config.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet>案例学习:简单的SpringMVC应用10.2本节开发一个简单的SpringMVC程序,主要介绍DispatcherServlet的配置、控制器的以及视图的开发。10.2.1创建JakartaEE项目10.2.2在web.xml中配置DispatcherServlet10.2.3创建SpringMVC配置文件10.2.4创建控制器10.2.5创建视图10.2.6运行应用程序创建JakartaEE项目在IntelliJIDEA中创建名为chapter10的JakartaEE项目,在版本页面选择JakartaEE9,在pom.xml文件中添加下面依赖项:注意,DispatcherServlet类包含在spring-webmvc-6.0.2.jar模块中。10.2.1<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.0.2</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>6.0.2</version></dependency>在web.xml中配置DispatcherServletweb.xml清单10.1DispatcherServlet是SpringMVC的入口,必须在web.xml中配置后才能起作用,web.xml文件的内容如清单10.1所示。<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns="https://jakarta.ee/xml/ns/jakartaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaeehttps://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"version="5.0"><display-name>SpringMVCApplication</display-name>10.2.2<servlet><servlet-name>springmvc</servlet-name><servlet-class>

org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name>

<url-pattern>/</url-pattern></servlet-mapping></web-app>创建SpringMVC配置文件springmvc-servlet.xml清单10.2由于在web.xml文件中指定了DispatcherServlet名称为springmvc,因此配置文件名应该为springmvc-servlet.xml,如清单10.2所示。<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xmlns:mvc="/schema/mvc"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd/schema/context/schema/context/spring-context-4.3.xsd10.2.3/schema/mvc/schema/mvc/spring-mvc-4.3.xsd">

<mvc:annotation-driven/><context:component-scanbase-package="com.boda.controller"/><beanid="viewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver"><propertyname="prefix"value="/WEB-INF/jsp/"/><propertyname="suffix"value=".jsp"/></bean></beans>配置文件中配置文件中<mvc:annotation-driven/>用于启用注解驱动。<context:component-scan/>元素告诉SpringMVC扫描指定包中的类,这里是com.boda.controller包。<bean>元素配置了视图解析器InternalResourceViewResolver来解析视图,将视图呈现给用户。视图解析器中配置的prefix属性值指定视图的前缀,suffix属性值指定视图的后缀。若控制器请求处理方法返回的字符串是hello,经过视图解析器后,视图的完整路径为/WEB-INF/jsp/hello.jsp。创建控制器HelloController.java清单10.3DispatcherServlet将请求动作代理给控制器(Controller)执行具体的功能。我们在定义控制器类时使用@Controller注解指明特定的类是控制器类。使用@RequestMapping注解将一个URL映射到整个类或某个特定的处理器方法。下面的HelloController是一个简单的控制器类。@ControllerpublicclassHelloController{privatestaticfinalLoglogger=LogFactory.getLog(HelloController.class);

@GetMapping(value="/hello-mvc")publicStringshowHomePage(Modelmodel){("控制器处理请求。");model.addAttribute("message","欢迎学习SpringMVC框架!");return"hello";}}10.2.4创建视图hello.jsp清单10.4SpringMVC支持许多类型的视图实现表示逻辑。其中包括JSP、HTML、PDF、Excel表格、XML、Velocity模板、XSLT、JSON等等。但最常用的视图还是JSP页面。下面是一个简单的JSP页面,它保存在/WEB-INF/jsp/hello.jsp。<%@pagecontentType="text/html;charset=UTF-8"%><html><head><title>HelloSpringMVC</title></head><body><p>${message}</p></body></html>10.2.5运行应用程序10.2.6要运行该程序,打开浏览器,在地址栏中输入下面URL,如果一切正常,结果如图10-2所示。http://localhost:8080/chapter10/hello-mvc控制器与请求处理方法10.3控制器是SpringMVC应用程序的核心组件,Spring使用@Controller注解标注控制器类。一个控制器类可以处理多个动作,这样就可以把相关的动作写在一个控制器类中,从而减少应用中控制器类的数量。使用@RequestMapping等注解类型,一个方法就可以成为请求处理方法。10.3.1控制器类和@Controller注解10.3.2@RequestMapping注解类型10.3.3编写请求处理方法10.3.4模型10.3.5视图解析器(ViewResolver)控制器类和@Controller注解在SpringMVC中,控制器类使用注解@Controller标注,它告诉SpringMVC该类的实例是控制器。下面的CustomerController类使用@Controller标注。packagecom.boda.controller;importorg.springframework.stereotype.Controller;...@ControllerpublicclassCustomerController{//请求处理方法}10.3.1控制器类和@Controller注解SpringMVC使用扫描机制查找应用程序中所有基于注解的控制器类。为了保证能够找到控制器,需要做两件事。首先,需要在SpringMVC配置文件springmvc-servlet.xml中声明spring-context模式,如下所示。其次,在配置文件中使用<context:component-scan/>元素,通过base-package属性指定控制器类所在的包名。例如,如果控制器类存储在com.boda.controller包或其子包中,<component-scan/>元素应该如下所示。<beans...xmlns:context="/schema/context"...>

<context:component-scanbase-package="com.boda.controller"/>10.3.1@RequestMapping注解类型10.3.2在控制器类中需要编写请求处理方法,每个方法处理一个动作。要告诉SpringMVC哪个方法处理哪个动作,应使用@RequestMapping注解类型指定方法映射URI。该注解类型用于将一个请求动作映射到一个方法,该注解类型可用于方法和类。注解描述@RequestMapping通用的请求处理@GetMapping处理HTTPGET请求@PostMapping处理HTTPPOST请求@PutMapping处理HTTPPUT请求@DeleteMapping处理HTTPDELETE请求@PatchMapping处理HTTPPATCH请求@RequestMapping注解类型1.@RequestMapping标注方法如果用于方法,该方法即为请求处理方法,即当DispatcherServlet接收到与该方法匹配的URI,它将调用该方法。下面的控制器类使用了@RequestMapping注解类型。@ControllerpublicclassCustomerController{@RequestMapping(value="/input-customer")publicStringinputCustomer(){//执行某些操作return"customerForm";//返回customerForm.jsp视图页面}}10.3.2@RequestMapping注解类型上述代码在inputCustomer()方法上使用@RequestMapping注解,通过value属性指定了URI映射,即将input-customer映射到inputCustomer()方法,当使用下面的请求URI时,inputCustomer()方法将被调用。由于value属性是@RequestMapping注解的默认属性,如果它是注解中唯一属性,属性名可以省略。下面两个注解含义相同。http://domain/context/input-customer@RequestMapping(value="/input-customer")@RequestMapping("/input-customer")10.3.2@RequestMapping注解类型除value属性外,@RequestMapping注解还有其他属性。例如,使用method属性可以指定HTTP方法,这样用对应的方法处理对应的HTTP请求。例如,下面的processOrder()方法将在处理HTTPPOST或PUT方法时被调用。若method属性仅指定一个HTTP方法,则大括号可以省略。@RequestMapping(value="/process-order",method={RequestMethod.POST,RequestMethod.PUT})publicStringprocessOrder(){//执行某些操作return"OrderForm";}@RequestMapping(value="/process-order",method=RequestMethod.POST)10.3.2如果没有提供method属性,请求处理方法可处理任何HTTP方法。要限制方法处理某种具体的请求(如GET或POST),还可以使用@GetMapping和@PostMapping等注解。例如,如果inputCustomer()方法仅处理GET请求,则注解可使用如下:@GetMapping(value="/input-customer")publicStringinputCustomer(){//执行某些操作return"customerForm";//返回customerForm.jsp视图页面}2.@RequestMapping标注类@RequestMapping还可以标注类,此时该注解定义了这个控制器所处理的根URL路径。例如,考虑下面控制器类的deleteCustomer()方法。@Controller@RequestMapping("/customer")//在类的定义上使用@RequestMapping注解publicclassCustomerController{@RequestMapping(value="/delete-customer",method=RequestMethod.POST)publicStringdeleteCustomer(){//执行某些操作return"result";}}@RequestMapping注解类型

由于控制器类被映射到“/customer”,而deleteCustomer()方法被映射到“/delete-customer”,如果要调用deleteCustomer()方法,应当使用下面URL。

在类级别使用了@RequestMapping注解后,还可以在方法级别使用@GetMapping等注解对方法的处理进行细化。比如,上述代码中的deleteCustomer()方法就可以使用@PostMapping注解。http://domain/context/customer/delete-customer@PostMapping(value="/delete-customer")publicStringdeleteCustomer(){//执行某些操作return"result";}10.3.2在为控制器方法声明请求映射时,越具体越好。这意味着至少要声明路径(也可以从类级别的@RequestMapping继承一个路径)以及它所处理的HTTP方法。一般来说,在类级别上使用@RequestMapping注解指定一个基本路径,在每个处理器方法上,使用更具体的@GetMapping或@PostMapping等注解。注解描述@RequestMapping通用的请求处理@GetMapping处理HTTPGET请求@PostMapping处理HTTPPOST请求@PutMapping处理HTTPPUT请求@DeleteMapping处理HTTPDELETE请求@PatchMapping处理HTTPPATCH请求编写请求处理方法请求处理方法可以带多个参数类型并返回一个类型。例如,如果在方法中需要访问HttpSession对象,可以添加一个HttpSession类型的参数,Spring会将正确的会话对象传递给方法。如果方法需要Locale对象和HttpServletRequest对象,也可以将它们传递给请求处理方法。@RequestMapping("/shopping-cart")publicStringmyMethod(HttpSessionsession){...session.addAttribute(key,value);...}@RequestMapping("/uri")publicStringmyOtherMethod(HttpServletRequestrequest,Localelocale){...//这里可以访问Locale对象和HttpServletRequest对象...}10.3.3编写请求处理方法10.3.3下面是可以出现在请求处理方法中常用的参数类型。jakarta.servlet.http.HttpServletRequest或jakarta.servlet.ServletRequestjakarta.servlet.http.HttpServletResponse或jakarta.servlet.ServletResponsejakarta.servlet.http.HttpSessionjava.util.Maporg.springframework.ui.Modelorg.springframework.ui.ModelMap其中最重要的类型是org.springframework.ui.Model,它不是ServletAPI类型,是SpringMVC类型,其中包含Map对象。当请求处理方法每次被调用时,SpringMVC创建一个Model对象并将各种对象存储在它的Map对象中。编写请求处理方法10.3.3请求处理方法可以返回下面类型的对象。Model对象ModelAndView对象表示逻辑视图名的String对象包含模型属性的Map对象在上述所列举的返回类型中,常见的返回类型是ModelAndView、String和void。其中ModelAndView类型中可以添加Model数据,并指定视图;String类型的返回值指定跳转视图,但不能携带数据;而void类型主要在异步请求时使用,它只返回数据,而不会跳转视图。下面示例应用中将学习如何编写请求处理方法。模型10.3.4在SpringMVC应用中经常需要存储模型数据。有多种方式存储模型数据:使用Model对象使用ModelMap对象使用ModelAndView对象可以使用org.springframework.ui包中的Model对象和ModelMap对象存储模型数据。SpringMVC在调用处理方法之前会创建一个隐含的模型对象作为模型数据的存储容器。如果处理方法的参数为Model或ModelMap对象,则SpringMVC会将隐含模型的引用传递给这些参数。在处理方法内部,开发者可以通过这个参数对象访问模型中的所有数据,也可以向模型中添加新的属性数据。模型10.3.4Model或ModelMap对象都可以使用下面方法添加模型数据:ModeladdAttribute(Stringname,Objectvalue)ModelMapaddAttribute(Stringname,Objectvalue)可以使用org.springframework.web.servlet.ModelAndView对象表示模型和视图,该类有多个构造方法,如下所示:ModelAndView(Stringname,)ModelAndView(Stringname,String,Object)ModelAndView类定义了addObject()方法用于添加模型数据:ModelAndViewaddObject(Stringname,Objectvalue)UserController.java清单10.5@ControllerpublicclassUserController{privatestaticfinalLoglogger= LogFactory.getLog("UserController.class");@ModelAttributepublicvoiduserModel(Stringusername,Stringpassword,Modelmodel){ ("用户模型"); Useruser=newUser(); //用JSP页面传来的参数设置User属性 user.setUsername(username); user.setPassword(password);model.addAttribute("user",user);}@RequestMapping(value="/input-user",method=RequestMethod.GET)publicStringinputUser(){ ("输入用户"); return"userForm";}@RequestMapping(value="/login-user",method=RequestMethod.POST)publicStringloginUser(Modelmodel){ ("用户登录"); //从Model中返回之前存入的名为user的对象 Useruser=(User)model.asMap().get("user"); user.setUsername("王小明"); return"showUser";}}视图解析器(ViewResolver)SpringMVC提供了视图解析器(viewresolver)以实现解析ModelAndView模型数据到特定视图上的功能。要使用和配置视图解析器,需要在配置文件中声明一个bean,如下所示:<beanid="viewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver"><propertyname="prefix"value="/WEB-INF/jsp/"/><propertyname="suffix"value=".jsp"/></bean>这里为视图解析器bean配置prefix和suffix两个属性,分别指定视图的前缀和后缀,从而可以使视图的路径更短。例如,视图名/WEB-INF/jsp/myPage.jsp就可以简单地写成myPage,视图解析器自动添加前缀和后缀。10.3.5请求参数接收方式10.4对客户传递的请求参数,需要使用控制器(Controller)接收,然后控制器对其进行处理。在SpringMVC中,控制器有多种方法接收请求参数,有的适合GET请求,有的适合POST请求,有的二者都适合。10.4.1用HttpServletRequest接收参数10.4.2用简单数据类型接收请求参数10.4.3用POJO对象接收请求参数10.4.4用@PathVariable接收URL中参数用HttpServletRequest接收参数可以通过表单向控制器传递请求参数,也可以通过URL向控制器传递请求参数。请求参数在URL中是&符号分隔的一组“键/值”对。例如,下面URL带一个id请求参数,它的值是103。请求参数被封装在HttpServletRequest请求对象中,因此可以通过它获取客户传递来的请求参数。具体方法是为请求处理方法传递一个HttpServletRequest对象,然后在请求处理方法中调用请求对象的getParameter()方法检索指定的请求参数。http://localhost:8080/chapter10/search-customer?id=103Stringid=request.getParameter("id");10.4.1用简单数据类型接收请求参数这种方法是在请求处理方法中使用与请求参数同名的形参接收请求参数值,这里要求方法参数名与请求参数名相同。如下面的saveCustomer()方法所示。@RequestMapping(value="/save-customer")publicStringsaveCustomer(Stringid,Stringname,Stringaddress,doublebalance,Modelmodel){("调用saveCustomer()方法");Customercustomer=newCustomer();customer.setId(id);customer.setName(name);customer.setAddress(address);customer.setBalance(balance);//将customer对象存储到模型对象中model.addAttribute("customer",customer);return"showCustomer";}10.4.2

需要注意的是,有时请求参数名与方法中形参名不一致,这会导致后台无法正确绑定并接收前端请求参数。为此,SpringMVC提供了@RequestParam注解来进行间接数据绑定。

使用org.springframework.web.bind.annotation.RequestParam注解类型标注一个参数,请求参数值将拷贝到该参数中。

例如,下面方法包含4个请求参数,它将请求参数值存储到对应变量中。publicStringsaveCustomer(@RequestParam(value="d")Stringc_id, @RequestParam(value="name")Stringc_name, @RequestParam(value="address")Stringc_address, @RequestParam(value="balance")doublec_balance,Modelmodel)用POJO对象接收请求参数

在SpringMVC中,还可以把请求参数自动绑定到POJO的属性上。这是将所有关联的请求参数封装到一个POJO中,在请求处理方法中直接使用该POJO作为形参来完成数据绑定。这种方法适合GET请求和POST请求。需要注意的是,POJO对象的属性名称必须与请求参数名相同。下面代码使用Customer对象接收请求参数。@RequestMapping(value="/save-customer")publicStringsaveCustomer(Customercustomer,Modelmodel){("调用saveCustomer()方法");//将customer对象存储到模型对象中model.addAttribute("customer",customer);return"showCustomer";}10.4.3用@PathVariable接收URL中参数用路径变量传递请求参数。路径变量与请求参数类似,但它不需要参数名,仅需提供一个参数值。例如,前面例子中search-customer动作被映射到下面的URL。http://localhost:8080/chapter10/search-customer/103这里,103就是一个路径变量值,在请求search-customer动作时将其传递给请求处理方法中对应的路径变量中。下面的searchCustomer()方法指定了路径变量id。10.4.4@RequestMapping(value="/search-customer/{id}")publicStringsearchCustomer(@PathVariableStringid,Modelmodel){Customercustomer=customerService.get(id);model.addAttribute("customer",customer);return"customerView";}使用路径变量,首先在@RequestMapping注解的value属性值中添加一个变量,该变量必须放在一对大括号中。例如,上面代码的@RequestMapping注解中使用了一个名为id的路径变量。在方法声明中使用@PathVariable注解标注一个参数变量id。当该方法被调用时,请求URL中的id值将被传递给方法的路径变量id,然后在方法中使用。路径变量的类型不一定是String。SpringMVC将进行自动转换。在请求中还可以使用多个路径变量。例如,下面定义了两个路径变量:userId和OrderId。@RequestMapping(value="/product_view/{userId}/{orderId}")转发、重定向与Flash属性在SpringMVC框架中,控制器的请求处理方法的return语句默认就是请求转发,只不过转发的目标是视图。如下代码所示。@RequestMapping(value="/user-register")publicStringuserRegister(){//注册代码return"register";//控制转发到register.jsp页面}10.5在请求处理方法中还可以使用下面语句将请求转发到控制器的另一个请求方法:return"forward:showUser";重定向是客户端行为,请求作用域中变量在转发到的资源将不可用,存储在会话作用域中变量可用。在有些环境下使用重定向可能更好,比如将控制重定向到外部资源,如另一个Web站点,这时就不能使用转发。为了避免这种情况,表单提交后,应该将用户重定向到一个不同的页面。这个页面多次加载不产生副作用。在前面例子中CustomerController类的saveCustomer()方法中如果使用重定向,return语句应该如下:return"redirect:/show-customer/"+customer.getId();要使用Flash属性,在SpringMVC配置文件中必须使用<annotation-driven/>元素。然后,在请求处理方法中添加一个org.springframework.web.servlet.mvc.support.RedirectAttributes类型的参数。下面代码演示了Flash属性的使用。@RequestMapping(value="save-customer",method=RequestMethod.POST)publicStringsaveCustomer(Customercustomer,RedirectAttributesredirectAttributes){("调用saveCustomer()方法");//保存customer对象CustomersavedCustomer=customerService.add(customer);redirectAttributes.addFlashAttribute("message","Thecustomerwassuccessfullyadded.");return"redirect:/view-customer/"+savedCustomer.getId();}可以使用HttpSession对象存储有关数据,然后在目标视图中使用EL表达式检索出来。publicStringsaveCustomer(Customercustomer,HttpSessionsession){("调用saveCustomer()方法");//保存customer对象CustomersavedCustomer=customerService.add(customer);session.setAttribute("customer",customer);return"redirect:/view-customer/"+savedCustomer.getId();}用@Autowired和@Service进行依赖注入

使用Spring框架的好处之一是容易使用依赖注入,毕竟Spring从一开始就是一个依赖注入容器。将一个依赖注入到SpringMVC控制器中最容易的方法是使用@Autowired注解标注一个字段或一个方法。该注解定义在org.springframework.beans.factory.annotation包中。

要使一个依赖被找到,它的类必须使用@Service注解,它定义在org.springframework.stereotype包中。该注解类型表示类是一个服务类。

此外,在配置文件中需要添加<component-scan/>元素扫描依赖类所在包。<context:component-scanbase-package="dependencyPackage"/>10.6作为示例,下面的CustomerController控制器类使用了@Autowired注解注入一个Service对象。CustomerController.java清单10.6@ControllerpublicclassCustomerController{privatestaticfinalLoglogger=LogFactory.getLog(CustomerController.class);@AutowiredprivateCustomerServicecustomerService;@RequestMapping(value="/input-customer")publicStringinputCustomer(){("inputCustomercalled");return"inputCustomer";}@RequestMapping(value="/save-customer",method=RequestMethod.POST)publicStringsaveCustomer(Customercustomer,RedirectAttributesredirectAttributes){("saveCustomercalled");//addcustomerCustomersavedCustomer=customerService.addCustomer(customer);redirectAttributes.addFlashAttribute("message","Theproductwassuccessfullyadded.");return"redirect:/view-customer/"+savedCustomer.getId();}

@RequestMapping(value="/view-customer/{id}")publicStringviewCustomer(@PathVariableLongid,Modelmodel){Customercustomer=customerService.getCustomer(id);model.addAttribute("customer",customer);return"showCustomer";}用@Autowired和@Service进行依赖注入CustomerService.java清单10.7下面清单给出了CustomerService接口及实现类。注意,要使实现类被扫描到,它必须使用@Service注解标注。importcom.boda.domain.Customer;publicinterfaceCustomerService{CustomeraddCustomer(Customercustomer

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论