来SpringMVC-1-入门配置
1 配置SpringMVC的前端核心控制器
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置前端核心控制器的初始化参数contextConfigLocation,指定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>
<!-- 如果配置/或者*.do,对rest风格支持不友好,暂时记住就是 / (好处就是可以自行放行) -->
<url-pattern>/</url-pattern>
</servlet-mapping>
2 配置Springmvc-config
<context:component-scan base-package="com.yuyi.springmvc.controller"/>
<!-- 视图解析器-jsp视图解析 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀必须是/结尾,否则容易出错 -->
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
3 配置对应的Controller
package com.yuyi.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloSpringmvcController {
/**
* 第一个请求处理方法
*/
@RequestMapping(value = "/helloMvc")
public String helloSpringMvc() {
System.out.println("------ Hello SpringMvc ------");
//返回一个目标视图,此处只要写目标jsp文件名称(不需要后缀)
return "success";
}
}
4 以及可以在类上进行注解配置
这种则需要类上注解+方法上注解组合才能进行访问,即(/springmvc/testRequestMappingMarkPlace)
package com.yuyi.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* Created on 2021/6/23.
* <p>
* Author: Lcywings
* <p>
* Description:请求控制器,@RequestMapping注解详解
*/
@Controller
@RequestMapping("/springmvc")
public class SpringMvcController {
/**
* 请求处理方法
*/
@RequestMapping("/testRequestMappingMarkPlace")
public String testRequestMappingMarkPlace() {
return "success";
}
}
@RequestMapping参数介绍:
Method参数:
/**
* method属性,指定请求处理方式
* 1.指定具体业务方法可以接收请求的方式,可以实现相同的请求,通过method指定不同的请求方式,实现不同的方法调用
* 2. 默认情况下,不加method属性,会自动根据前端请求适配(get,post等都支持),一但指定了请求处理方式,会自动根据前端请求适配(get,post等都支持),一旦指定了请求处理方式,就只能接受该类型请求
* 否则异常:HTTP Status 405—方法不允许
*/
@RequestMapping(value = "/testRequestMappingMethod", method = RequestMethod.GET)
public String testRequestMappingMethod1() {
return "hello";
}
/**
* 多method的指定方法
*/
@RequestMapping(value = "/testRequestMappingMethod", method = {RequestMethod.POST, RequestMethod.DELETE})
public String testRequestMappingMethod2() {
return "success";
}
Params参数:
/**
* params参数,指定请求携带参数
* 1.指定请求必须携带参数,可以指定多个(使用大括号,逗号分割),如果没有参数请求404
* 2.可以值请求参数必须是某个值,否则不给访问(并不代表默认值)
*/
@RequestMapping(value = "/testRequestMappingParams", params = {"userName", "userPwd=EDG"})
public String testRequestMappingParams() {
return "success";
}
headers参数:
/**
* headers参数,指定请求头携带的参数,类似于params属性
*
* @return
*/
@RequestMapping(value = "/testRequestMappingHeaders", headers = "token")
public String testRequestMappingHeaders() {
return "success";
}
@PathVariable:
/**
* PathVariable参数注解用法, 只能加载方法参数上
* 1.作用:可以将请求url中使用占位符进行参数绑定,直接将其绑定到目标请求处理方法的形参上
* 2.注意:请求处理映射地址中的{xxx},必须跟请求处理方法入参注解@PathVariable (xxx)保持一致
*/
@RequestMapping(value = "/testRequestMappingPathVariable/{userName}/{userPwd}")
public String testRequestMappingPathVariable(@PathVariable("userName") String userName, @PathVariable("userPwd") String userPwd) {
System.out.println("userName = " + userName + ", userPwd = " + userPwd);
return "success";
}
REST风格:
/**
* @author : zhukang
* @date : 2021-06-23
* @return : java.lang.String
* @description : rest请求处理方式:GET
*/
@RequestMapping(value = "/testRequestMappingREST/{id}", method = RequestMethod.GET)
public String testRequestMappingRESTGET(@PathVariable("id")String id){
System.out.println("Rest Get : select " + id);
return "success";
}
/**
* @author : zhukang
* @date : 2021-06-23
* @return : java.lang.String
* @description : rest请求处理方式:POST
*/
@RequestMapping(value = "/testRequestMappingREST", method = RequestMethod.POST)
public String testRequestMappingRESTPOST(){
System.out.println("Rest Post : insert ");
return "success";
}
/**
* @author : zhukang
* @date : 2021-06-23
* @return : java.lang.String
* @description : rest请求处理方式:PUT
*/
@RequestMapping(value = "/testRequestMappingREST", method = RequestMethod.PUT)
public String testRequestMappingRESTPUT(){
System.out.println("Rest Put : update ");
return "success";
}
/**
* @author : zhukang
* @date : 2021-06-23
* @return : java.lang.String
* @description : rest请求处理方式:DELETE
*/
@RequestMapping(value = "/testRequestMappingREST/{id}", method = RequestMethod.DELETE)
public String testRequestMappingRESTDELETE(@PathVariable("id")String id){
System.out.println("Rest Delete : delete " + id);
return "success";
}
同时这玩意需要《Rest风格请求转换过滤器》来辅助,就是下面这玩意,写在web.xml之中
<!-- 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>
他会自动识别post请求,并转换成你想要发送的请求类型(put、delete、push之类的),但是form表单递交其他请求很麻烦,需要用个隐藏域传一个名为_method的变量,如下:
<form action="/testRequestMappingREST" method="post">
<input type="submit" value="Test RquestMapping Rest Post"/>
</form>
<form action="/testRequestMappingREST" method="post">
<input type="hidden" name="_method" value="put"/>
<input type="submit" value="Test RquestMapping Rest Put"/>
</form>
<form action="/testRequestMappingREST/1" method="post">
<input type="hidden" name="_method" value="delete"/>
<input type="submit" value="Test RquestMapping Rest Delete"/>
</form>
处理请求数据
@RequestParam 注解
/**
* @author : zhukang
* @date : 2021-06-23
* @return : java.lang.String
* @description : 请求参数注解RequestParam,必须掌握
* 1)作用范围:只能出现在方法的形参上,可以不写(如果参数名和形参名一致,可以自动参数绑定)
* 2)如果只写此注解,不写任何属性值,代表参数比传,且参数名必须跟方法形参名一致,否则不能自动绑定参数,且报错
* 3)value属性:指定绑定参数名,代表客户端必须按照指定的别名传参
* 4)required属性:默认是true,代表参数比传,如果不需要比传校验,可以改为false
* 5)defaultValue属性:如果参数没传,防止参数为null,可以指定默认值
*
*/
@RequestMapping(value = "/testRequestMappingRequestParam")
public String testRequestMappingRequestParam(@RequestParam(value = "uname", required = false, defaultValue = "admin") String userName, String userPwd){
System.out.println("入参:userName = " + userName + ", userPwd = " + userPwd);
return "success";
}
@RequestHeader 注解
请求头包含了若干个属性,服务器可据此获知客户端的信息,通过 @RequestHeader 即可将请求头中的属性值绑定到处理方法的入参中
/**
* @RequestParam请求参数注解
*/
@RequestMapping(value = "/testRequestMappingRESTToken", method = RequestMethod.POST)
public String testRequestMappingRESTToken(@RequestHeader("token") String token) {
System.out.println("入参: token = " + token);
return "hello";
}
@CookieValue注解
- 使用@CookieValue绑定请求中的cookie值
- @CookieValue可以让处理方法入参绑定摸个Cookie值
/**
* @RequestParam请求参数注解
*/
@RequestMapping(value = "/testRequestMappingRESTChookieValue")
public String testRequestMappingRESTChookieValue(@CookieValue("JSESSIONID") String JSESSIONID) {
System.out.println("入参: JSESSIONID = " + JSESSIONID);
return "hello";
}
实体入参
突出一个全自动:
- 使用 POJO 对象绑定请求参数值
- Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配,自动为该对象填充属性 值。支持级联属性。
/**
* @RequestParam请求实体参数绑定 自动根据入参的参数名和实体属性进行绑定
*/
@RequestMapping(value = "/testRequestMappingPoJo")
public String testRequestMappingPoJo(User user) {
System.out.println("实体入参: user = " + user);
return "hello";
}
使用 Servlet 原生 API 作为参数
可以直接使用形参承接Servlet的参数
MVC 的 Handler 方法可以接受哪些 ServletAPI 类型的参数 :
-
HttpServletRequest
-
HttpServletResponse
-
HttpSession
-
java.security.Principal
-
Locale
-
InputStream
-
OutputStream
-
Reader
-
Writer
/**
* @author : Lcywings
* @date : 2021/6/24 15:00
* @acl : true
* @description : 使用Servlet的原生API接口作为参数
*/
@RequestMapping(value = "/testRequestMappingServletApi", method = RequestMethod.POST)
public void testRequestMappingServletApi(HttpServletRequest request, HttpServletResponse response,
HttpSession session) throws Exception {
//获取参数
String userName = request.getParameter("userName");
System.out.println("******************************** userName:" + userName);
//转发
request.getRequestDispatcher("/WEB-INF/views/testRequestMappingServletApi").forward(request, response);
}
Q.E.D.