(五)、使用注解开发SpringMVC
(1).使用SpringMVC必须要配置的三大件: 处理器映射器 处理器适配器 视图解析器 (2).如果使用注解进行开发的话 那么 处理器映射器 处理器适配器 就会被自动注入,不用我们去配置了
1.Spring下面的配置(可以写死)
1.进行配置的约束 http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd 2.扫描注解下面的所有包 <context:component-scan base-package="Com.Jsxs.Controller"/> 3.使SpringMVC处理静态资源 <mvc:default-servlet-handler/> 4.导入驱动的注解 <mvc:annotation-driven/> 5.视图解析器
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd "> <!-- 扫描包--> <context:component-scan base-package="Com.Jsxs.Controller"/> <!-- 让Spring MVC不处理静态资源--> <mvc:default-servlet-handler/> <!-- 支持驱动注解 在spring中一般采用 @RequestMapping注解来完成映射关系 要想使 @RequestMapping 注解生效 必须像上下文中注册DefaultAnnotationHandleMapping 和一个AnnotationMethodHandlerAdapter实列 这两个实列分别在类级别和方法级别处理 而annotation-driven配置,自动帮我们完成上述的两个实列的注入 --> <mvc:annotation-driven/> <!-- 视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
2.注册DispatcherServlet(可以写死 )
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!-- 1. 配置DispatcherServlet 核心--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 3. DispatcherServlet要绑定Spring的配置文件--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> <!-- 4. 启动级别: 就是让他和服务器进行同步--> <load-on-startup>1</load-on-startup> </servlet> <!-- 2. 在SpringMVC中, / 只匹配所有的请求,不会去请求jsp /* 匹配所有的请求,会请求jsp 在springMvc中 我们尽量写/ --> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
3.Controller控制层
1.@Controller 设置为 controller 2. @RequestMapping("/hello") 请求映射
package Com.Jsxs.Controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HelloController { @RequestMapping("/hello") public String hello(Model model){ model.addAttribute("msg","hello springAnnotation!!"); return "hello"; //会被试图解析器处理; } }
@RequestMapping(“/hello”)才是真正的映射的地址
(六)、Controller【控制器】
- 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现
- 在控制器负责解析用户的请求并将其转换成一个模型
- 在Spring MVC中一个控制器类可以包含多个方法
- 在Spring MVC中,对于Controller的配置有很多种
1.实现一个Controller的接口
控制层
package Com.Jsxs.Controller; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class controllerFirst implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("msg","这是通过接口来实现"); modelAndView.setViewName("hello"); return modelAndView; } }
spring层
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd "> <!-- 开始扫描包下的注解--> <context:component-scan base-package="Com.Jsxs.Controller"/> <!-- 设置默认--> <mvc:default-servlet-handler/> <!-- 设置驱动器--> <mvc:annotation-driven/> <!-- 试图解释器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <bean class="Com.Jsxs.Controller.controllerFirst" id="/hello"/> </beans>
2.使用注解实现Controller
@Component 组件 @service service @Controller controller @Repository dao
1.这个返回类型为字符串的方法,返回值的名字不是随便要起的,而是存在页面的 名字。如果乱其名字的话,我们可能会面临404的尴尬处境 2.方法里面的参数是 Model 不是其他的
控制层
package Com.Jsxs.Controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class TwoController { @RequestMapping("/hello2") public String test(Model model){ model.addAttribute("msg","这是利用注解进行开发的数据"); return "hello"; //这个的意思就是说要和jsp文中的文件的名字一样,不能乱起名字 } }
spring可以不用写bean了
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd "> <!-- 开始扫描包下的注解--> <context:component-scan base-package="Com.Jsxs.Controller"/> <!-- 设置默认--> <mvc:default-servlet-handler/> <!-- 设置驱动器--> <mvc:annotation-driven/> <!-- 试图解释器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
3.新思路
并不是说一个网站又N张页面,我们就对它设置了N张的JSP,而有可能我们只是对其进行了一些的数据更新,并没有做到每一个数据更新就需要更换一张JSP ;
eg:
package Com.Jsxs.Controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class TwoController { @RequestMapping("/hello2") public String test(Model model){ model.addAttribute("msg","这是利用注解进行开发的数据2"); return "hello"; //这个的意思就是说要和jsp文中的文件的名字一样,不能乱起名字 } @RequestMapping("/hello1") public String test2(Model model){ model.addAttribute("msg","这是利用注解进行开发的数据1"); return "hello"; //这个的意思就是说要和jsp文中的文件的名字一样,不能乱起名字 } }
(七)、RequestMapping【请求映射】
@RequestMapping 是 Spring Web 应用程序中最常被用到的注解之一。这个注解会将 HTTP 请求映射到 MVC 和 REST 控制器的处理方法上。
1.RequestMapping在方法上
RequestMapping在方法上会精确的找到这一 个方法
package Com.Jsxs.Controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class Controller2 { @RequestMapping("/hello2") public String test(Model model){ model.addAttribute("msg","进入了控制层2,映射是hello2"); return "hello"; //这个的意思就是说要和jsp文中的文件的名字一样,不能乱起名字 } @RequestMapping("/hello1") public String test2(Model model){ model.addAttribute("msg","进入了控制层2,映射是hello1"); return "hello"; //这个的意思就是说要和jsp文中的文件的名字一样,不能乱起名字 } }
2.RequestMapping在类上
package Com.Jsxs.Controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/hello3") public class Controller3 { @RequestMapping("/hello2") public String test(Model model){ model.addAttribute("msg","进入了控制层3,映射的IP是hello3"); return "hello"; } }
3.RequestMapping在类上和方法上同时存在
我们要先访问类路径上的然后再访问方法路上的,相当于加了一层 http://localhost/SpringMVC_06_Controller_war_exploded/hello3/hello2
package Com.Jsxs.Controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/hello3") public class Controller3 { @RequestMapping("hello2") public String test(Model model){ model.addAttribute("msg","进入了控制层3,映射的IP是hello3"); return "hello"; } }