1
* springmvc使用流程小结: * 1、Tomcat服务器启动时,自动创建前端核心控制器的实例-DispatcherServlet,同时自动读取配置的spring-mvc.xml核心配置文件,创建容器对象,并扫描组件加入到容器中 * 即:将控制器组件(加了@Controller注解)加入到容器中,并自动解析加入的请求控制器,可以得到请求处理url和请求处理方法的映射 * 2、客户端浏览器,发送请求:http://localhost:8096/helloMvc * 3、请求会被前端核心控制器拦截(匹配到前端核心控制器的url-pattern) * 4、前端核心控制器,自动根据请求url和请求处理方法的映射关系,进行映射查找,如果找到了对应关系,自动将当前请求发送给目标请求处理器的请求处理方法,进行业务处理,如果没有找到,直接报错误404 * 5、目标请求处理方法,处理完业务后,返回一个目标视图的名称-success * 6、返回的目标视图名称,仍然会交给前端核心控制器进行视图解析(自动调用容器中添加的视图解析器解析),会得到一个真实的目标物理视图页面(要跳转的真实页面),进行响应跳转目标页面给浏览器显示 */
2springmvc中的@Controller
@Controller // 不可以用其它的分层注解替换,只能用controller(1、可以作为一个控制层组件扫描到容器 2、代表一个控制器)
3
@RequestMapping("/helloMvc") // 定义当前请求控制器中,可以处理请求的映射url字符串,前面的 / 可写可不写,建议写
4
(1) * @description : 请求映射注解:可以写的位置 * 可以标记在类上:给当前请求处理器,增加初步映射信息(以此开头),相对于web应用根目录 * 可以标记在方法上:给当前请求处理方法,指定具体的映射信息,如果类上也有此注解的标记,方法上的映射是相对于类上的映射(先写类的映射,再写方法的映射),如果类上没有此注解的标记,那方法上就是相对于web应用根目录 */ @RequestMapping("/testMvcRequestMappingMarkTarget") public String testMvcRequestMappingMarkTarget(){ // 返回成功页面 return "success"; } /** * @return : java.lang.String * @description : 请求映射注解:method属性,作用:指定当前请求处理方法接收的请求处理方式 */ @RequestMapping(value = "/testMvcRequestMappingMethodGet", method = RequestMethod.GET) public String testMvcRequestMappingMethodGet(){ System.out.println("------ RequestMapping 属性 method = RequestMethod.GET ------"); // 返回成功页面 return "success"; } @RequestMapping(value = "/testMvcRequestMappingMethodPost", method = RequestMethod.POST) public String testMvcRequestMappingMethodPost(){ System.out.println("------ RequestMapping 属性 method = RequestMethod.POST ------"); // 返回成功页面 return "success"; } /** * @return : java.lang.String * @description : 请求映射注解:method属性,可以指定多个请求方式,一旦指定了请求处理方式,就只能是指定的请求方式,才可以映射处理,如果不指定,自动适配 */ @RequestMapping(value = "/testMvcRequestMappingMethodGetAndPost", method = {RequestMethod.GET, RequestMethod.POST}) public String testMvcRequestMappingMethodGetAndPost(){ System.out.println("------ RequestMapping 属性 method = RequestMethod.POST ------"); // 返回成功页面 return "success"; } /** * @return : java.lang.String * @description : 请求映射注解:params属性,作用:指定当前处理方法对应的请求,必须要携带的参数 * 1、写法1:指定当前请求必须携带的参数名,没有参数值,可以指定多个(大括号,逗号分隔),如果请求没有携带params指定的所有参数(缺一不可),请求404 * 1、写法2:指定当前请求必须携带的参数名和对应的参数值,可以指定多个(大括号,逗号分隔),如果请求没有携带params指定的所有参数,请求404,如果请求携带的参数及对应的参数值和params属性指定的不一致,也请求404 * 误区:被误认为是当没有携带参数时,给定默认值,其实不是,是参数值必须是指定的值 */ @RequestMapping(value = "/testMvcRequestMappingParams", params = {"uname=kh96", "upwd"}) public String testMvcRequestMappingParams(){ System.out.println("------ RequestMapping 属性 params ------"); // 返回成功页面 return "success"; } /** * @return : java.lang.String * @description : 请求映射注解:headers属性,作用:指定当前处理方法对应的请求,必须要携带的请求头参数,用法和params类似,参数位置不同 */ @RequestMapping(value = "/testMvcRequestMappingHeaders", headers = {"token"}) public String testMvcRequestMappingHeaders(){ System.out.println("------ RequestMapping 属性 headers ------"); // 返回成功页面 return "success"; } /** * @return : java.lang.String * @description : 请求映射注解:请求占位符注解@PathVariable * 用法:只能写在请求处理方法的形参中 * 作用:自动将RequestMapping中指定的url使用的占位符根据请求,获取参数值,并绑定到方法参数中,即:请求地址映射为:/url/{参数名},目标请求为:/url/参数值,自动将参数值绑定到指定的参数名上 * 要求1:@PathVariable("指定参数名"),RequestMapping注解请求url中,指定的占位符参数名,必须跟当前请求处理方法形参中@PathVariable注解指定的参数名一致,否则报错:Could not find @PathVariable [utel] in @RequestMapping * 要求2:@PathVariable只写注解,RequestMapping注解请求url中,指定的占位符参数名,必须跟当前请求处理方法对象形参名一致,否则报错:Could not find @PathVariable [uemail] in @RequestMapping * */ @RequestMapping("/testMvcRequestMappingPathVariable/{utel}/{uemail}") public String testMvcRequestMappingPathVariable(@PathVariable("utel") String utel, @PathVariable String uemail){ System.out.println(String.format("------ RequestMapping + PathVariable utel: %s, uemail:%s ------", utel, uemail)); // 返回成功页面 return "success"; } /** * @return : java.lang.String * @description : 请求映射注解:rest风格处理-get,查询select */ // @RequestMapping(value = "/testMvcRequestMappingRestGet/{uid}", method = RequestMethod.GET) @RequestMapping(value = "/testMvcRequestMappingRest/{uid}", method = RequestMethod.GET) public String testMvcRequestMappingRestGet(@PathVariable("uid") String uid){ System.out.println(String.format("------ Rest Get 根据 uid: %s ,查询用户详情 ------", uid)); // 返回成功页面 return "success"; } /** * @return : java.lang.String * @description : 请求映射注解:rest风格处理-post,新增insert */ // @RequestMapping(value = "/testMvcRequestMappingRestPost", method = RequestMethod.POST) @RequestMapping(value = "/testMvcRequestMappingRest", method = RequestMethod.POST) public String testMvcRequestMappingRestPost(){ System.out.println(String.format("------ Rest Post 新增用户详情 ------")); // 返回成功页面 return "success"; } /** * @return : java.lang.String * @description : 请求映射注解:rest风格处理-put,更新update */ // @RequestMapping(value = "/testMvcRequestMappingRestPut", method = RequestMethod.PUT) @RequestMapping(value = "/testMvcRequestMappingRest", method = RequestMethod.PUT) public String testMvcRequestMappingRestPut(){ System.out.println(String.format("------ Rest Put 更新用户详情 ------")); // 返回成功页面 return "success"; } /** * @return : java.lang.String * @description : 请求映射注解:rest风格处理-delete,删除delete */ // @RequestMapping(value = "/testMvcRequestMappingRestDelete/{uid}", method = RequestMethod.DELETE) @RequestMapping(value = "/testMvcRequestMappingRest/{uid}", method = RequestMethod.DELETE) public String testMvcRequestMappingRestDelete(@PathVariable("uid") String uid){ System.out.println(String.format("------ Rest Delete 根据 uid: %s ,删除用户详情 ------", uid)); // 返回成功页面 return "success"; }
5:springmvc的web.xml基本配置
<!-- 前端核心控制器-springmvc框架提供的 --> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 配置初始化参数,指定springmvc的核心配置文件,目的就是自动创建容器对象 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <!-- web容器启动,优先创建前端核心控制器实例对象 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <!-- javaweb阶段,此处映射路径一般都是固定路径或者/*或者*.xx,但是此方式对rest风格不友好,先记住就只有一个 / ,可以自动放行jsp --> <url-pattern>/</url-pattern> </servlet-mapping> <!-- Rest风格请求方式转换过滤器 --> <filter> <filter-name>hiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>hiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
6:核心配置文件
<!-- 组件扫描 --> <context:component-scan base-package="com.kgc.mvc"/> <!-- jsp视图解析器 --> <!-- 作用:当前请求处理方法返回一个目标视图页面的名称,视图解析器会自动将返回的目标视图名称解析为真实的目标物理视图(prefix + 目标视图页面名称 + suffix) --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 统一前缀,请求处理方法返回目标视图名称时,会被统一增加此前缀目录(目标视图目录),结尾的 / 不能少 --> <property name="prefix" value="/WEB-INF/views/"/> <!-- 统一后缀,请求处理方法返回目标视图名称时,会被统一增加此后缀标识 --> <property name="suffix" value=".jsp"/> </bean>
7springmvc,maven下基本依赖dependency(基本依赖包括了部分spring与mabiyes配置)
<properties> <mybatis.version>3.4.1</mybatis.version> <junit.version>4.11</junit.version> <lombok.version>1.16.18</lombok.version> <mysql.version>5.1.47</mysql.version> <log4j.version>1.2.17</log4j.version> <spring.version>4.3.18.RELEASE</spring.version> </properties> <dependencies> <!--spring begin--> <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <!----> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!--web servlet--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- junit begin --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <!-- junit end --> <!-- mybatis begin --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <!-- mybatis end --> <!-- mysql begin --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!-- mysql end --> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency> <!-- lombok begin --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </dependency> <!-- lombok end --> <!--log4j begin --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <!--log4j end --> </dependencies>