SpringMVC入门

本文详细介绍了SpringMVC的工作流程,包括核心组件DispatcherServlet的作用及配置方法,不同类型的注解如@Controller、@RequestMapping的功能与使用场景,以及如何通过@PathVariable、@RequestParam等获取请求参数。
  1. SpringMVC的工作流程图
    在这里插入图片描述

  2. Spring MVC的核心类和注解

    (1)DispatcherServlet:当用户通过客户端向服务器发送请求时,会被Spring MVC前端控制器DispatcherServlet所拦截。其在web.xml配置如下:

<!-- 通过以一下配置,拦截所有请求,交给SpringMVC处理 -->
  <servlet>
	<servlet-name>springDispatcherServlet</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<!-- 
	指定springmvc配置文件的路径,
	如果配置文件为默认地址,则不需要配置
	即在WEB-INF里以<servlet-name>-servlet.xml
	(springDispatcherServlet-servlet.xml) 
	-->
	<init-param>
		<param-name>ContextConfigLocation</param-name>
		<param-value>classpath:springmvc.xml</param-value>
	</init-param>
	<!-- 启动时,以第一个身份启动,如果不存在,则应用程序会在第一个servlet请求时加载该servlet -->
	<load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  	<servlet-name>springDispatcherServlet</servlet-name>
  	<url-pattern>/</url-pattern>
  	<!-- /表示处理所有请求,如果配置的是.action,则只处理.action结尾的请求 -->
  </servlet-mapping>

(2)Controller注解类型
为保证Spring能够找到控制器类,需要在Spring MVC的配置文件中添加相应的扫描配置信息,同时在配置文件中配备视图解析器,以便Controller控制器类请求转发时为放回路劲添加前缀和后缀

<!-- 扫描有注解的包 -->
	<context:component-scan base-package="com.springmvc.servlet"></context:component-scan>
	<!-- 配置视图解析器(InternalResourceViewResolver )-->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/view/"></property>
		<property name="suffix" value=".jsp"></property>
	</bean>
@Controller
public class SpringmvcText {}

(3)RequestMapping注解类型
@RequestMapping注解的使用:用于映射一个请求或一个方法,可以使用该注解标注一个方法或一个类。@RequestMapping注解的使用以及属性如下:

//映射是匹配@RequestMapping注解,可以和方法名,类不一致
	//通过method指定请求方式(get post delete put)
	//params={"name","age!=23",...}则请求中必须含有name参数,age!=23,如果有age,则必须age!=23、可以没有age属性;!height则不能出现name=height参数
	@RequestMapping(value="welcome",method=RequestMethod.POST,params= {"name"})//映射 与("welcome")相同
	public String welcome() {
		return "success";//view/success.jsp默认使用请求转发的跳转方式,通过视图解析器增加前缀后缀
	}
	//ant风格请求路径:*表示任意字符0个或多个、**表示任意目录、?表示单个字符
	//@RequestMapping(value="welcome1/*/test")
	//@RequestMapping(value="welcome1/a?b/test")
	@RequestMapping(value="welcome1/**/test")
	public String welcome1() {
		return "success";
	}
	

前端jsp对应测试

<a href="welcome1/adfbd/test">ant*</a><br>
<form action="welcome" method="post">
	<input type="text" name="name">
	<input type="submit" value="提交">
</form>
<a href="testPathVariable/zs">testPathVariable</a><br>

(4)REST风格:GET查、POST增、DELETE删、PUT改;普通浏览器只支持get post方式,其他请求如delete|put是通过过滤器(HiddenHttpMethodFilter)加入的;具体做法如下:
①在web.xml中配置HiddenHttpMethodFilter过滤器

<!--  过滤器,目的是给普通浏览器增加delete|put请求方式-->
  <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>

②需利用影藏域 input type=“hidden” name="_method" value=“delete|put”/>的value值指定请求方式且请求方式为post

<form action="testRest" method="post">
	<input type="hidden" name="_method" value="DELETE"/>
	id:<input type="text" name="id"><br>
	<input type="submit" value="删">
</form>

(5)@PathVariable,@RequestParam,@RequestHeader,@CookieValue属性
@PathVariable:从请求路径获取参数

@RequestMapping(value="testPathVariable/{name}")
	public String testPathVariable(@PathVariable("name") String name) {
		System.out.println(name);
		return "success";
	}
//前端测试
<a href="testPathVariable/zs">testPathVariable</a><br>

@RequestParam:从表单获取参数值

//设置required=false,defaultValue="zs",则value可以不传值,默认为zs
	@RequestMapping(value="testRequestParam")
	public String testRequestParam(@RequestParam("id") Integer id,@RequestParam(value="uname",defaultValue="zs") String uname) {
		//@RequestParam("id") Integer id ==Integer id = request.getParameter("id");
		System.out.println(id+","+uname);
		return "success";
	}
/*
<form action="testRequestParam" method="post">
	id:<input type="text" name="id"><br>
	name:<input type="text" name="uname"><br>
	<input type="submit" value="提交">
</form>
*/

@RequestHeader,@CookieValue:获取请求头和cookie值

//RequestHeader("")获取请求头信息
	//CookieValue通过mvc获取cookie值(JSESSIONID)
	@RequestMapping(value="testCookieValue")
	public String testCookieValue(@CookieValue("JSESSIONID")String jsessionId) {
		System.out.println(jsessionId);
		return "success";
	}
//<a href="testCookieValue">testCookieValue</a><br>

使用对象(实体类)接受请求参数

	@RequestMapping(value="testObjectProperties")
	public String testObjectProperties(User user) {
		System.out.println(user.getId()+","+user.getName()+","+user.getAddress().getHomeAddress()+","+user.getAddress().getSchoolAddress());
		return "success";
	}
	/*
	<form action="testObjectProperties" method="post">
	id:<input type="text" name="id"><br>
	name:<input type="text" name="name"><br>
	HAddress:<input type="text" name="address.homeAddress"><br>
	SAddress:<input type="text" name="address.schoolAddress"><br>
	<input type="submit" value="提交">
</form>
	*/

3、处理模型数据,前面使用的例子获取数据后直接在后台打印,并没有将数据传输到view层,如果跳转时需要带数据:V、M则可以使用以下方式:
ModelAndView,ModeMap,Map,Model --数据放在request作用域@SessionAttributes,@ModelAttribute

@RequestMapping(value="testModelAndView")
	public ModelAndView testModelAndView(User user) {//ModelAndView:既有数据又有视图
		ModelAndView mv = new ModelAndView("success-testModelAndView");
		mv.addObject("user", user);//相当于request.setAttribute("user",User);
		return mv;
	}
	
	@RequestMapping(value="testModeMap")//Map,Model类似
	public String testModeMap(ModelMap mm) {
		User user = new User();
		user.setId(123);
		user.setName("name");
		mm.put("user", user);
		return "success-testModelAndView";
	}

将数据放入session中,@SessionAttributes
@ModelAttribute经常在更新时使用

//在类头定义
//@SessionAttributes(value="user1,user2")//多个情况下
//@SessionAttributes(types=User.class)//如果在request中存放User类型对象,则同时将该类型对象放入session域中
@SessionAttributes("user")//如果在request中存放user对象,则同时将该对象放入session域中
//查询
	@ModelAttribute//在任何一次请求前,都会执行@ModelAttribute修饰的方法
	public void queryUserById(Map<String,Object> map) {
		System.out.println("nihao");
		User user = new User();
		user.setId(11);
		user.setName("zs");
		Address address = new Address();
		address.setHomeAddress("hg");
		user.setAddress(address);
		map.put("user",user);//map的key就是方法参数类型的首字母小写后一致
		//map.put("u", user);
		//public String testModelAttribute(@ModelAttribute("u")User user)
	}
	//修改
	@RequestMapping(value="testModelAttribute")
	public String testModelAttribute(User user) {
		//user.setName("li");
		System.out.println(user.getId()+","+user.getName()+user.getAddress().getHomeAddress());
		return "success-testModelAndView";
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值