一、SpringMVC基础入门,创建一个HelloWorld程序

0.框架结构

1.首先,导入SpringMVC需要的jar包。

2.添加Web.xml配置文件中关于springmvc的配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name> <!--
在Spring框架中是如何解决从页面传来的字符串的编码问题的呢?
下面我们来看看Spring框架给我们提供过滤器CharacterEncodingFilter
这个过滤器就是针对于每次浏览器请求进行过滤的,然后再其之上添加了父类没有的功能即处理字符编码。
其中encoding用来设置编码格式,forceEncoding用来设置是否理会 request.getCharacterEncoding()方法,设置为true则强制覆盖之前的编码格式。-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <!--
如果你的DispatcherServlet拦截"/",为了实现REST风格,拦截了所有的请求,那么同时对*.js,*.jpg等静态文件的访问也就被拦截了。
方案一:激活Tomcat的defaultServlet来处理静态文件
要写在DispatcherServlet的前面, 让 defaultServlet先拦截请求,这样请求就不会进入Spring了,我想性能是最好的吧。
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.swf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.xml</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.json</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.map</url-pattern>
</servlet-mapping> --> <!--
1.SpringMVC配置 前置控制器(SpringMVC的入口)
DispatcherServlet是一个Servlet,,所以可以配置多个DispatcherServlet -->
<servlet>
<!--
在DispatcherServlet的初始化过程中,框架会在web应用的 WEB-INF文件夹下寻找名为[servlet-name]-servlet.xml 的配置文件,生成文件中定义的bean。
这里使用默认的配置文件名:springmvc-servlet.xml
-->
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--
程序运行时从web.xml开始,加载顺序为:context-param -> listener -> filter ->structs (如果使用structs的话)-> servlet
设置web.xml文件启动时加载的顺序(1代表容器启动时首先初始化该servlet,让这个Servlet随Servletp容器一起启动)
load-on-startup是指这个servlet是在当前web应用被加载的时候就被创建,而不是第一次被请求的时候被创建 -->
<load-on-startup>1</load-on-startup>
<!--
默认加载配置文件:
/WEB-INF/{servlet-name}-servlet.xml
也可以指定路径放在src下:
<init-param>
<param-name>contextConfigLocation</param-name> -->
<!--
其中<param-value>**.xml</param-value> 这里可以使用多种写法
1、不写,使用默认值:/WEB-INF/<servlet-name>-servlet.xml
2、<param-value>/WEB-INF/classes/springmvc-servlet.xml</param-value>
3、<param-value>classpath*:springmvc-servlet.xml</param-value>
4、多个值用逗号分隔
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
--> </servlet>
<servlet-mapping>
<!--
这个Servlet的名字是springmvc,可以有多个DispatcherServlet,是通过名字来区分的。每一个DispatcherServlet有自己的WebApplicationContext上下文对象。同时保存的ServletContext中和Request对象中.
ApplicationContext是Spring的核心,Context我们通常解释为上下文环境,我想用“容器”来表述它更容易理解一些,ApplicationContext则是“应用的容器”了:P,Spring把Bean放在这个容器中,在需要的时候,用getBean方法取出-->
<servlet-name>springmvc</servlet-name>
<!--
Servlet拦截匹配规则可以自已定义,当映射为@RequestMapping("/user/add")时,为例,拦截哪种URL合适?
1、拦截*.do、*.htm, 例如:/user/add.do,这是最传统的方式,最简单也最实用。不会导致静态文件(jpg,js,css)被拦截。
2、拦截/,例如:/user/add,可以实现现在很流行的REST风格。很多互联网类型的应用很喜欢这种风格的URL。弊端:会导致静态文件(jpg,js,css)被拦截后不能正常显示。 -->
<!--
可选配置:
*.do、*.action、*.html
/
/xxx/* 不可以:
/*
-->
<!-- 会拦截除过*.html URL中带的请求。-->
<url-pattern>*.html</url-pattern>
</servlet-mapping> <welcome-file-list>
<!-- 浏览器输入到项目名,默认打开如下配置页面 -->
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

3.在WEB-INF下添加springmvc-servlet.xml配置文件

<?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-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <!-- (1)默认扫描的包路径 -->
<context:component-scan base-package="com.controller" /> <!-- (2)定义视图解析器
class="org.springframework.web.servlet.view.UrlBasedViewResolver"(基于URL的视图解析器):老版本使用的,利用创建1个视图解析工具类对象的方式
Controller中方法return返回的视图,拼接前后缀,得到结果结果页面地址,因为页面放在WEB-INF下,必须以这种方式访问。
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
<!-- (3)让一些静态的不被springmvc拦截 -->
<mvc:default-servlet-handler/>
<mvc:annotation-driven/> </beans>

4.在WEB-INF文件夹下创建名为jsp的文件夹,用来存放jsp视图。创建一个success.jsp,在body中添加“Hello World”。

5.建立包及Controller,如下所示

6.编写Controller代码

package com.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; /**
* 控制器类(控制层)
* @author asus
*
* @Controller
* (1)可将class定义为一个controller类
* (2)为使spring能找到定义为controller的bean
* (3)使用@component,也可以起到@Controller同样的作用
*/
@Controller
@RequestMapping("/mvc")
public class HelloWorldController { /**
*
* @RequestMapping("/url")
* (1)在类前面定义,则将url和类绑定。
* (2)在方法前面定义,则将url和类的方法绑定
*
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。 RequestMapping注解有六个属性,下面我们把她分成三类进行说明(下面有相应示例)。 1、 value, method; value: 指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明); method: 指定请求的method类型, GET、POST、PUT、DELETE等; 2、consumes,produces consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html; produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回; 3、params,headers params: 指定request中必须包含某些参数值是,才让该方法处理。 headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
*/
@RequestMapping("/helloYou")
public String hello(){
System.out.println("执行hello方法。。");
return "success";
} }

7.启动服务器,键入 http://localhost:8080/项目名/mvc/helloYou

二、配置解析

  1.Dispatcherservlet

    DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据相应的规则分发到目标Controller来处理,是配置spring MVC的第一步。

  2.InternalResourceViewResolver

    视图名称解析器

  3.以上出现的注解

    @Controller 负责注册一个bean 到spring 上下文中

    @RequestMapping 注解为控制器指定可以处理哪些 URL 请求

三、SpringMVC常用注解

  @Controller

  负责注册一个bean 到spring 上下文中

  @RequestMapping

  注解为控制器指定可以处理哪些 URL 请求

  @RequestBody

  该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上 ,再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上

  @ResponseBody

  该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区

  @ModelAttribute    

  在方法定义上使用 @ModelAttribute 注解:Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方法

  在方法的入参前使用 @ModelAttribute 注解:可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数 –绑定到对象中,再传入入参将方法入参对象添加到模型中

  @RequestParam 

  在处理方法入参处使用 @RequestParam 可以把请求参 数传递给请求方法

  @PathVariable

  绑定 URL 占位符到入参

  @ExceptionHandler

  注解到方法上,出现异常时会执行该方法

  @ControllerAdvice

  使一个Contoller成为全局的异常处理类,类中用@ExceptionHandler方法注解的方法可以处理所有Controller发生的异常

四、JSP页面向后台传值

1.使用HttpServletRequest获取

    /**
* 使用HttpServletRequest获取
* @param request
* @return success
*/
@RequestMapping("/getParameter")
public String request_getParameter(HttpServletRequest request){ request.getParameter("name");
request.getParameter("password");
return "success";
}

2.自动匹配参数

    /**
* method automatically 自动匹配参数
* @param name
* @param password
* @return success
*/
@RequestMapping("/userParam")
public String user_param(String name,String password){ System.out.println("name:"+name+"\t password:"+password);
return "success";
}

3.自动装箱

    /**
* boxing automatically 自动装箱
* @param user 默认request范围
* @return success
*/
@RequestMapping("/userClass")
public String user_class(Users user){ System.out.println("name:"+user.getName()+"\t password:"+user.getPassword());
return "success";
}

4.使用@RequestParam注解

    /**
* 接收请求参数
* @RequestParam
* 主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter("name")
* 它有三个常用参数:
* defaultValue = "0" :若没有取到请求参数,则使用默认参数。
* required = false :必填。若请求参数为空会报错。默认false
* value :表示传入参数的名称
* @param name
* @param password
* @return success
*/ @RequestMapping("/requestParam")
public String request_param(@RequestParam(value="name",required=true,defaultValue="boby") String name, @RequestParam(value="password") String password){
System.out.println("name:"+name+"\t password:"+password);
return "success";
}

5.@ModelAttribute做为参数使用接收对象

    /**
* 接收请求对象并把对象默认存入request范围中
* @ModelAttribute
* 通常使用在Controller方法的参数注解中,用于解释model entity
* 默认的模型属性名称自动判断声明的属性类型(如,方法参数类型或方法返回类型)。如这个值是orderAddress,就对于当前包. OrderAddress(表示:users.class)。
* @param user
* @return
*/
@RequestMapping("/modelAttributeClass")
public String modelAttribute_class(@ModelAttribute("user0") Users user){ System.out.println(user.getName()+"\t"+user.getPassword());
return "success";
}

五、后台向JSP页面响应值

1.使用HttpServletRequest 或Session  然后setAttribute(),就和Servlet中一样

    /**
* 使用HttpServletRequest传值
* @param request
* @return success
*/
@RequestMapping("/setAttrivute")
public String request_attribute(HttpServletRequest request){
System.out.println("执行request_attribute()");
List list=new ArrayList();
list.add("m");
list.add("v"); Users user=new Users("sabo", "bb33"); request.setAttribute("list0", list);//将结果集响应给success页面,默认转发跳转,request范围。
request.setAttribute("user0", user); return "success";
}

2.ModelAndView模型视图类

    /**
* 向页面传值
* ModelAndView模型视图类
见名知意,从名字上我们可以知道
ModelAndView中的Model代表模型
View代表视图
即,这个类把要显示的数据存储到了Model属性中,要跳转的视图信息存储到了view属性。
*/
@RequestMapping("/modelAndViewObj")
public ModelAndView modelAndView_obj(){ List list=new ArrayList();
list.add("a");
list.add("b"); Users user=new Users("admin", "a123"); ModelAndView mav=new ModelAndView("success");//将结果集响应给success页面,默认转发跳转,request范围。
mav.addObject("list1", list);
mav.addObject("user1",user);
return mav;
}

3.以Map集合为参数的方式向页面传值

    /**
* 以Map集合为参数的方式向页面传值,默认request的范围
* @param map
* @return success
*/
@RequestMapping("/mapObj")
public String map_obj(Map<String, Object> map ){ List list=new ArrayList();
list.add("c");
list.add("d"); Users user=new Users("aQ", "q332"); map.put("list2", list);
map.put("user2", user);
return "success";
}

4.使用ModelMap参数对象

    /**
* 使用ModelMap参数对象
* ModelMap数据会利用HttpServletRequest的Attribute传值到success.jsp中
* @param modelMap
* @return success
*/
@RequestMapping("/modelMapObj")
public String modelMap_obj(ModelMap modelMap ){ List list=new ArrayList();
list.add("e");
list.add("f"); Users user=new Users("MM", "m367"); modelMap.put("list3", list);
modelMap.put("user3", user);
return "success";
}

六、常用注解

1.@ModelAttribute注解标注在方法上、该Controller的所有方法在调用前,先执行此@ModelAttribute方法。

    /**
* @ModelAttribute注解
* 在Spring MVC里,@ModelAttribute通常使用在Controller方法的参数注解中,用于解释model entity,但同时,也可以放在方法注解里。
* 如果把@ModelAttribute放在方法的注解上时,代表的是:该Controller的所有方法在调用前,先执行此@ModelAttribute方法。
*
*/
@RequestMapping("/helloWorld")
public String helloWorld(){ return "success";
}
@ModelAttribute
public void populateModel(@RequestParam String name,Model model){ model.addAttribute("name4",name);//把接收到的属性存入request范围
} @ModelAttribute("user4")
public Users addUsers(@RequestParam("name") String name,@RequestParam("password") String password){ return new Users(name, password);//把接收到的属性存入对象request范围
}

七、作用域范围

1.传统servlet版,耦合方式

    /**
* HttpServletRequest耦合方式(传统servlet)
*
* request,session,application范围
*
*/
@RequestMapping("/servletScope")
public String servlet_scope(HttpServletRequest request,HttpSession session){ Users user=new Users("admin", "a123"); //request范围
request.setAttribute("user5", user); //session范围
session.setAttribute("user6", user);
HttpSession session2 = request.getSession();
session2.setAttribute("user7", user); //application范围
ServletContext application = request.getSession().getServletContext();
application.setAttribute("user8", user);
return "success";
}

2. SpringMvc特有方式、Model对象、request范围

    /**
* request范围
* Model对象
* @param name
* @param model
* @return success
*/
@RequestMapping("/model")
public String model(@RequestParam String name,Model model){ model.addAttribute("name5",name);//把接收到的属性存入request范围
return "success";
}

3.@SessionAttributes

  (1)这个表明会话属性的注释被特定的处理器使用。它通常列出存储在会话中模型属性的名称。声明在类级别,适用于这个注释的处理器类可以操作的模型属性。

  (2)注意:这个注释表明使用会话中的session就像使用一个特定的模型属性。一旦处理器完成这些属性也将被删除。因此使用这种会话属性的机制,都应支持在一个特定的会话过程中临时存储。

  (3)永久会话属性(如:用户身份验证对象),请使用传统的session.setAttribute方法。另外,也可考虑使用WebRequest。

  (4)注意,当时有Controller接口,确保始终把@RequestMapping和@SessionAttributes放在控制器接口上而不是实现类上。

  属性:

    String[] value:存储在会话中的会话属性名称。注意,这里指定的模型属性名称。会话属性名称不一定匹配模型属性名称。应用程序不应该依赖会话属性名称。

    Class[] types:存储在会话中的会话属性类型。这种类型的所有模型属性都将存储在会话中,无论属性名称是什么。

举例说明

3.1:通过Model绑定

    Spring允许我们有选择地指定Model中的哪些属性需要转存到session中,以便下一个请求可通过Session来访问到这些属性。这一功能是通过类定义处标注@SessionAttributes注解来实现的。

@Controller
@RequestMapping(value = "login")
@SessionAttributes("mysession")
//定义把Model中的mysession属性的值绑定到Session中
public class LoginController {
@RequestMapping(method = RequestMethod.POST)
public String login(@ModelAttribute User user, ModelMap model) {
String viewName = "";
boolean check = true;
if (check) {
model.addAttribute("mysession", "123");
viewName = "redirect:/home";
} else {
viewName = "redirect:/";
}
return viewName;
}
}

这样我们不但可以在请求所对应的JSP视图页面中通过request.getAttribute()和session.getAttribute()获取mysession,还可以在下一个请求所对应的JSP视图页面中通过session.getAttribute()或ModelMap#get()访问到这个属性。

这里我们仅将一个ModelMap的属性放入Session中,其实@SessionAttributes允许指定多个属性。你可以通过字符串数组的方式指定多个属性,如 @SessionAttributes({“attr1”,”attr2”})。此外,@SessionAttributes还可以通过属性类型指定要 session化的ModelMap属性,如@SessionAttributes(types=User.class),当然也可以指定多个类,如 @SessionAttributes(types = {User.class,Dept.class}),还可以联合使用属性名和属性类型指定:@SessionAttributes(types = {User.class,Dept.class},value={“attr1”,”attr2”})。

3.2SpringMVC特有方式、@ModelAttribute 和 @SessionAttributes、实现session范围存值、取值

  1.Spring允许我们有选择地指定Model中的哪些属性需要转存到session中,以便下一个请求可通过Session来访问到这些属性。这一功能是通过类定义处标注@SessionAttributes注解来实现的。

  2.@SessionAttributes()配合@ModelAttribute()也可接收Session中的值。

官方例子:

@Controller
@RequestMapping(value = "login")
@SessionAttributes("user")
//此处定义需要绑定到session中的model名称
public class LoginController {
@RequestMapping(method = RequestMethod.POST)
public String login(@ModelAttribute("user") User user, ModelMap model){
//@ModelAttribute将绑定到session中
String viewName = "";
boolean check = true;
if (check) {
viewName = "redirect:/home";
} else {
viewName = "redirect:/";
}
return viewName;
}
}

自己例子:

package com.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes; import com.entity.Users; /**
* 控制器类(控制层)
* @author asus
*
* @Controller
* (1)可将class定义为一个controller类
* (2)为使spring能找到定义为controller的bean
* (3)使用@component,也可以起到@Controller同样的作用
*
* @SessionAttributes
* 会话注解
* String[] value:存储在会话中的会话属性名称。注意,这里指定的模型属性名称。会话属性名称不一定匹配模型属性名称。应用程序不应该依赖会话属性名称。
* Class[] types :存储在会话中的会话属性类型。这种类型的所有模型属性都将存储在会话中,无论属性名称是什么。
*/
@Controller
@RequestMapping("/mvc")
@SessionAttributes(value={"user9"})//此处定义需要绑定到session中的model名称(可多个参数)
public class HelloWorldController { /**
* session范围
* 使用 @ModelAttribute 和 @SessionAttributes 传递和保存数据SpringMvc特有方法
* 在不同的模型(model)和控制器之间共享数据(session范围)
*/
@ModelAttribute("user9")
public Users getUsers(){ return new Users("zs1","aaa");//参数@ModelAttribute取到对象则覆盖此对象
}
@RequestMapping("/sayHello")
public String sayHello(@ModelAttribute("user9") Users user){
//将@ModelAttribute中value绑定到session中 user=new Users("sayHello", "a123"); return "success";
} }

3.3@SessionAttributes清除

@SessionAttributes需要清除时,使用SessionStatus.setComplete();来清除。注意,它只清除@SessionAttributes的session,不会清除HttpSession的数据。故如用户身份验证对象的session一般不同它来实现,还是用session.setAttribute等传统的方式实现。

@Controller
@RequestMapping(value = "login")
@SessionAttributes("mysession")
// 定义把Model中的mysession属性的值绑定到Session中
public class LoginController {
@RequestMapping(method = RequestMethod.POST)
public String login(@ModelAttribute User user, ModelMap model,
SessionStatus sessionStatus) {
String viewName = "";
boolean check = true;
if (check) {
model.addAttribute("mysession", "1233");
viewName = "redirect:/home";
} else {
viewName = "redirect:/";
}
sessionStatus.setComplete(); return viewName;
}
}

八、RESTFul风格

简单RESTFul风格示例

1.请求页面

  <body>
<h2>请求页面</h2> <!-- stest_rest() -->
<a href="mvc/zs/ab123/18/rest.html">test_rest();获取url的各级路径 :REST风格</a><br>
<a href="mvc/rest/lisi/bc567/22.html">test_rest();获取url的各级路径 :REST风格2</a><br>
</body>

2.Controller

    /**
* 获取url的各级路径 :RESTFul风格
* @PathVariable
* 绑定 URL 占位符到入参
*/
@RequestMapping("/{a}/{b}/{c}/rest")
public String test_rest(@PathVariable("a") String name,@PathVariable("b") String password,@PathVariable("c") int age){ System.out.println(name+"\t"+password+"\t"+age);
return "success";
}
@RequestMapping("/rest/{a}/{b}/{c}")
public String test_rest2(@PathVariable("a") String name,@PathVariable("b") String password,@PathVariable("c") int age){ System.out.println(name+"\t"+password+"\t"+age);
return "success";
}

3.响应结果页面

  <body>
<h2>响应结果页面</h2> <!-- test_rest() -->
<h4>test_rest();获取url的各级路径 :REST风格;(取不到url方式传过去的值。。还需要找方法。!)</h4>
${requestScope.a }<br>
${requestScope.b }<br>
${requestScope.c }<br>
</body>

详细  RESTFul风格+HiddenHttpMethodFilter过滤器  示例

什么是REST?首先来段介绍吧。

REST: 即 Representational State Transfer。 (资源)表现层状态转化。 是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、 扩展方便,所以正得到越来越多网站的采用。

资源(Resources) : 网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务, 总之就是一个具体的存在。可以用一个URI(统一资源定位符)指向它, 每种资源对应一个特定的 URI 。 要获取这个资源, 访问它的URI就可以, 因此 URI 即为每一个资源的独一无二的识别符。

表现层(Representation) : 把资源具体呈现出来的形式,叫做它的表现层(Representation) 。比如,文本可以用 txt 格式表现,也可以用 HTML 格式、 XML 格式、 JSON 格式表现,甚至可以采用二进制格式。

状态转化(State Transfer) : 每发出一个请求, 就代表了客户 端和服务器的一次交互过程。 HTTP协议,是一个无状态协议,即所有的状态都保存在服务器端。因此, 如果客户端想要操作服务器,必须通过某种手段, 让服务器端发生“

状态转化”。而这种转化是建立在表现层之上的,所以就是 “表现层状态转化”。 具体说, 就是 HTTP 协议里面,四个表示操作方式的动词: GET、 POST、 PUT、 DELETE。它们分别对应四种基本操作: GET 用来获取资源, POST 用来新建资源, PUT 用来更新资源, DELETE 用来删除资源。(本文出自:http://my.oschina.net/happyBKs/blog/416994)

示例:

– /order/1 HTTP GET : 得到 id = 1 的 order

– /order/1 HTTP DELETE: 删除 id = 1 的 order

– /order/1 HTTP PUT:更新id = 1 的 order

– /order HTTP POST:新增 order

但是要用spring实现四个方法需要一个过滤器:

HiddenHttpMethodFilter: 浏览器 form 表单只支持 GET与 POST 请求,而DELETE、 PUT 等 method 并不支持, Spring3.0 添加了一个过滤器,可以将这些请求转换为标准的 http 方法,使得支持 GET、 POST、 PUT 与DELETE 请求。

带占位符的 URL 是 Spring3.0 新增的功能, 该功能在SpringMVC 向 REST 目 标挺进发展过程中具有里程碑的意义。

通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中: URL 中的 {xxx} 占位符可以通过@PathVariable("xxx") 绑定到操作方法的入参中

1.web.xml中添加HiddenHtttpMethodFilter过滤器

      <!-- 隐藏的HTTP方法过滤 -->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<servlet-name>springmvc</servlet-name>
<!-- springmvc或/* 二选一即可
<url-pattern>/*</url-pattern>
-->
</filter-mapping>

2.接下来写控制器类及其方法,来负责接收和处理请求:HelloWorldController类

    /**
* Rest 风格的Url 原先利用请求参数的风格
* 以CRUD为例
* 新增: /order POST
* 修改:/order/1 Put update?id=1
* 获取:/order/1 GET get?id=1
* 删除:/order/1 DELETE delete?id=1
*
* 如何发送PUT请求和DELETE请求?
* 1.需要配置HiddenHttpMethodFilter
* 2.需要发送POST请求
* 3.需要在发送POST请求时携带一个name=”_method“的隐藏域,值为DELETE或PUT
*
* 在SpringMVC的目标方法中如何得到id呢?
* 使用@PathVariable注解
*/
@RequestMapping(value="/testmethod",method=RequestMethod.POST)
public String restPost(){
System.out.println("post");
System.out.println("post operations...");
return "success";
}
@RequestMapping(value="/testmethod/{id}",method=RequestMethod.PUT)
public String restPut(@PathVariable int id){
System.out.println("put"+id);
System.out.println("put operations");
return "success";
}
@RequestMapping(value="/testmethod/{id}",method=RequestMethod.GET)
public String restGet(@PathVariable int id){
System.out.println("get"+id);
System.out.println("querry operations...");
return "success";
}
@RequestMapping(value="/testmethod/{id}",method=RequestMethod.DELETE)
public String restDelete(@PathVariable("id") int id){
System.out.println("delete"+id);
System.out.println("delete operations");
return "success";
}

请求页面

  <body>
<h2>请求页面</h2> <!-- rest风格+HiddenHttpMethodFilter CRUD -->
<h4>rest风格+HiddenHttpMethodFilter CRUD</h4>
<form action="mvc/testmethod.html" method="post" >
<input type="submit" value="POST Request(添加)" >
</form> <form action="mvc/testmethod/1.html" method="post" >
<input type="hidden" name="_method" value="PUT" >
<input type="submit" value="PUT Request(修改)" >
</form> <a href="mvc/testmethod/1.html" >GET Request(查询)</a> <form action="mvc/testmethod/1.html" method="post" >
<input type="hidden" name="_method" value="DELETE" >
<input type="submit" value="DELETE Request(删除)" >
</form>
</body>

注意:我用的是Tomcat7服务器。tomcat8似乎不支持PUT和DELETE请求,即使我已经在Tomcat的conf文件夹下的web.xml加入了readonly参数并设置为false,依然不能解决问题。

<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

点击post请求和delete请求的结果是:

九、使用Ajax异步刷新

Controller

    /**
* 使用Ajax异步刷新
* @param PrintWriter
* 想页面输出内容
*/
@RequestMapping("/testAjax")
public void testAjax(String name , PrintWriter pw){
System.out.println("name"+name);
pw.print("name:"+name);
}

JQuest

    <script type="text/javascript" language="javascript" src="js/jquery-1.8.3.js" ></script>
<script type="text/javascript">
//使用Ajax($.ajax)调用
function ajax(){
$.ajax({
type:"post",
url:"mvc/testAjax.html",
cache:false,
data:"name=abc",
dataType:"text",
success:function(result){
alert("成功!"+result);
},
error:function(){ }
});
}
//使用Ajax($.post)调用
function post(){
$.post(
"mvc/testAjax.html",
{name:"def"},
function(result){
alert("成功!"+result)
}
);
}
</script>

注意事项:异步刷新时,请求UTL,找不到对应的控制器映射。

        /**
* SpringMVC 异步刷新时,没有找到HTTP请求的URI映射。(控制台报的错)
* 解决办法:
* 1.JSP页面From表单,action中取全路径url
* <form id="form1" action="${pageContext.request.contextPath }/lineController/insertSelective.html" >
* 2.异步刷新$.ajax或$.post
* url:$("#form1").attr("action"),
*/
警告: No mapping found for HTTP request with URI [/LifeBegins/lineController/lineController/insertSelective.html] in DispatcherServlet with name 'SpringMVC'

十、SpringMVC详细运行流程图

十一、SpringMVC与struts2的区别

  1、springmvc基于方法开发的,struts2基于类开发的。springmvc将url和controller里的方法映射。映射成功后springmvc生成一个Handler对象,对象中只包括了一个method。方法执行结束,形参数据销毁。springmvc的controller开发类似web service开发。

  2、springmvc可以进行单例开发,并且建议使用单例开发,struts2通过类的成员变量接收参数,无法使用单例,只能使用多例。

  3、经过实际测试,struts2速度慢,在于使用struts标签,如果使用struts建议使用jstl。

SpringMVC详细示例的更多相关文章

  1. 巩固一下:SpringMVC详细示例实战教程

    一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 1 2 3 4 5 6 ...

  2. 史上最全最强SpringMVC详细示例实战教程

    一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 1 2 3 4 5 6 ...

  3. SpringMVC详细示例实战教程

    一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 1 2 3 4 5 6 ...

  4. SpringMVC详细示例实战

    一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 1 2 3 4 5 6 ...

  5. 转:史上最全最强SpringMVC详细示例实战教程

    一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 <!--conf ...

  6. SpringMVC详细示例实战教程(较全开发教程)

    SpringMVC学习笔记---- 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于Spring ...

  7. 史上最全最强SpringMVC详细示例实战教程【good】

    1)Spring MVC 在调用处理方法之前,在请求线程中自动的创建一个隐含的模型对象. 2)调用所有方法级的 标注了 @ModelAttribute 的方法,并将方法返回值添加到隐含的模型对象中. ...

  8. [转]史上最全最强SpringMVC详细示例实战教程

    原文:http://www.cnblogs.com/sunniest/p/4555801.html?utm_source=tuicool&utm_medium=referral SpringM ...

  9. SpringMVC+RestFul详细示例实战教程

    一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 <!--conf ...

随机推荐

  1. WPF快速入门系列(8)——MVVM快速入门

    一.引言 在前面介绍了WPF一些核心的内容,其中包括WPF布局.依赖属性.路由事件.绑定.命令.资源样式和模板.然而,在WPF还衍生出了一种很好的编程框架,即WVVM,在Web端开发有MVC,在WPF ...

  2. dex分包变形记

    腾讯Bugly特约作者:李金涛 一.背景 就在项目灰度测试前不久,爆出了在 Android 3.0以下手机上安装时出现 INSTALL _ FAILED_DEXOPT,导致安装失败.这一问题意味着项目 ...

  3. Java语法糖3:泛型

    泛型初探 在泛型(Generic type或Generics)出现之前,是这么写代码的: public static void main(String[] args) { List list = ne ...

  4. Java虚拟机10:类加载器

    类与类加载器 虚拟机设计团队把类加载阶段张的"通过一个类的全限定名来获取此类的二进制字节流"这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现这 ...

  5. DOM扩展札记

    Selector API HTML5 DOM扩展 Element Traversal规范 Selector API 众多JavaScript库中,最常用的一个功能就是根据css选择符选择与某个模式匹配 ...

  6. 获取IOS应用的子目录

    在开发IOS应用时,我们经常需要将素材分类,并放入相应地子目录中. 在开发代码时,需要访问这些素材时,就需要获取对应的子目录路径.那么如何获取呢? 获取应用路径 首先,要找到应用所在的路径. NSSt ...

  7. 《OOC》笔记(3)——C语言变长参数va_list的用法

    <OOC>笔记(3)——C语言变长参数va_list的用法 C语言中赫赫有名的printf函数,能够接受的参数数目不固定,这就是变长参数.C#里也有params这个关键字用来实现变长参数. ...

  8. redis配置文件redis.conf中文版(基于2.4)

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/99.html?1455869981 代码如下: # Redis示例配置文件 ...

  9. Atititi.名字 姓名 name 起名naming spec 的构成结构规范v2 qc2.docx

    Atititi.名字 姓名 name 起名naming spec 的构成结构规范v2 qc2.docx 1.1. 职业名 官职等 amir 阿米尔 放前面1 1.2. 本名1 1.3. 父名,祖名,一 ...

  10. Java六大问题你都懂了吗?

    这些问题对于认真学习java的人都要必知的,当然如果你只是初学者就没必要那么严格了,那如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列. 一.到底要怎么样初始化! 本问题讨论 ...