欢迎光临散文网 会员登陆 & 注册

SpringMVC

2020-08-10 16:36 作者:某个峙祁  | 我要投稿

环境配置

pom.xml配置

<properties>
   <maven.compiler.source>1.8</maven.compiler.source>
   <maven.compiler.target>1.8</maven.compiler.target>
   <spring.version>5.2.3.RELEASE</spring.version>
 </properties>

 <dependencies>
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-context</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>

   <dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>servlet-api</artifactId>
     <version>2.5</version>
     <scope>provided</scope>
   </dependency>

   <dependency>
     <groupId>javax.servlet.jsp</groupId>
     <artifactId>jsp-api</artifactId>
     <version>2.0</version>
     <scope>provided</scope>
   </dependency>
   <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>4.11</version>
     <scope>test</scope>
   </dependency>
 </dependencies>



web.xml 配置

<web-app>
 <servlet>
     <servlet-name>dispatcherServlet</servlet-name>
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     <init-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>classpath:spring.xml</param-value>
     </init-param>
   </servlet>
   <servlet-mapping>
     <servlet-name>dispatcherServlet</servlet-name>
       
<!--   在sprMVC中, /   /*       这是拦截所有url
/:只匹配所有请求,不会去匹配jsp页面
/*:匹配所有请求,包括jsp
-->
     <url-pattern>/</url-pattern>
   </servlet-mapping>

</web-app>


配置处理器适配器

 <!--配置控制器适配器
  所有的处理适配器都实现HandlerAdapter接口
  -->
   <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>


编写Handler

需要实现Controller接口 才能由SimpleControllerHandlerAdapter这个适配器执行

public class StudentController implements Controller {
   @Override
   public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {

       ModelAndView mv=new ModelAndView();
       Student student=new Student();
       student.setName("哇哈哈");
       mv.addObject("student",student);
       mv.setViewName("index");
       return mv;

   }
}


配置处理器映射器

<!--配置控制映射器-->
   <!--配置handler-->
   <bean name="/123.action" id="hemoeController1" class="controller.StudentController"></bean>
<!--处理器映射器讲bean的name作为url进行查找
   需要配置handler时指定bean的name,即指定访问的url-->
   <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>


视图解析器

<!--配置视图解析器
   解析jsp。默认使用jstl,需要jstl包-->
   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
       <property name="prefix" value="/WEB-INF/view/"></property>
       <property name="suffix" value=".jsp"></property>
   </bean>


使用注解

注解的处理器映射器和适配器

在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。 使 用 mvc:annotation-driven 自动加RequestMappingHandlerMapping (处理映射器) 和RequestMappingHandlerAdapter ( 处 理 适 配 器 ) , 可 用 在 SpringMVC.xml 配 置 文 件 中 使 用mvc:annotation-driven替代注解处理器和适配器的配置。

它就相当于在 xml 中配置了:

<!-- Begin -->
<!-- HandlerMapping -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- HandlerAdapter -->
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
<bean
class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
<bean
class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!-- HadnlerExceptionResolvers -->
<bean
class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver"></bean>
<bean
class="org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver"></bean>
<bean
class="org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver"
></bean>
<!-- End -->

配置案例:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:mvc="http://www.springframework.org/schema/mvc"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

   <context:component-scan base-package="controller"></context:component-scan>
   
   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
       <property name="prefix" value="/WEB-INF/view/"></property>
       <property name="suffix" value=".jsp"></property>
   </bean>

   <mvc:annotation-driven></mvc:annotation-driven>

</beans>


@Controller
public class StudentController {

   @RequestMapping("/abc.action")
   public String getHome(){
       return "index";
   }
}


RequestMapping   建立请求 URL 和处理请求方法之间的对应关系

作用: 用于建立请求 URL 和处理请求方法之间的对应关系。

@RequestMapping(value = "/abc.action",method = RequestMethod.GET)
public String getHome(){
       return "index";
 }


RequestParam注解  为参数取别名

为参数取别名,前端传递的时候就以 username为准

@GetMapping("/u1")
   public String test1(@RequestParam("username") String name, Model model){
       //加上@RequestParam则前端传入的参数为注解value
       //接收前端参数
       System.out.println("接收到的前端参数为:"+name);
       //将返回的结果传递给前端,model
       model.addAttribute("msg",name);
       //视图跳转
       return "test1";
   }


RequestBody  获取请求体内容

作用: 用于获取请求体内容。直接使用得到是 key=value&key=value...结构的数据。 get 请求方式不适用。 属性: required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值 为 false,get 请求得到是 null。

使用示例:

<form action="anno/testRequestBody" method="post">
       用户姓名:<input type="text" name="username" /><br/>
       用户年龄:<input type="text" name="age" /><br/>
       <input type="submit" value="提交" />
   </form>


/**
    * 获取到请求体的内容
    * @return
    */
   @RequestMapping("/testRequestBody")
   public String testRequestBody(@RequestBody String body){
       System.out.println("执行了...");
       System.out.println(body);
       return "success";
   }

执行结果:

//输出结果:
username=admin&age=11


PathVaribale  用于绑定 url 中的占位符

作用: 用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。 url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。 属性: value:用于指定 url 中占位符名称。 required:是否必须提供占位符

使用示例

<a href="anno/testPathVariable/10">testPathVariable</a>
/**
    * PathVariable注解
    * @return
    */
   @RequestMapping(value="/testPathVariable/{sid}")
   public String testPathVariable(@PathVariable(name="sid") String id){
       System.out.println("执行了...");
       System.out.println(id);
       return "success";
   }


RequestHeader  获取请求消息头

作用: 用于获取请求消息头。 属性: value:提供消息头名称 required:是否必须有此消息头 注: 在实际开发中一般不怎么用。

<a href="anno/testRequestHeader">RequestHeader</a>
/**
    * 获取请求头的值
    * @param header
    * @return
    */
   @RequestMapping(value="/testRequestHeader")
   public String testRequestHeader(@RequestHeader(value="Accept") String header, HttpServletRequest request,HttpServletResponse response) throws IOException {
       System.out.println("执行了...");
       System.out.println(header);
       // return "success";
       // response.sendRedirect(request.getContextPath()+"/anno/testCookieValue");
       return "redirect:/param.jsp";
   }


CookieValue  把指定 cookie 名称的值传入控制器方法参数

作用: 用于把指定 cookie 名称的值传入控制器方法参数。 属性: value:指定 cookie 的名称。 required:是否必须有此 cookie。

使用示例

<a href="anno/testCookieValue">CookieValue</a>
/**
    * 获取Cookie的值
    * @return
    */
   @RequestMapping(value="/testCookieValue")
   public String testCookieValue(@CookieValue(value="JSESSIONID") String cookieValue){
       System.out.println("执行了...");
       System.out.println(cookieValue);
       return "success";
   }


ModelAttribute  用于修饰方法和参数

作用: 该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。 出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可 以修饰有具体返回值的方法。 出现在参数上,获取指定的数据给参数赋值。 属性: value:用于获取数据的 key。key 可以是 POJO 的属性名称,也可以是 map 结构的 key。 应用场景: 当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。 例如: 我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数 据是肯定没有此字段的内容,一旦更新会把该字段内容置为 null,此时就可以使用此注解解决问题。

使用示例

<form action="anno/testModelAttribute" method="post">
       用户姓名:<input type="text" name="uname" /><br/>
       用户年龄:<input type="text" name="age" /><br/>
       <input type="submit" value="提交" />
   </form>
/**
    * ModelAttribute注解
    * @return
    */
   @RequestMapping(value="/testModelAttribute")
   public String testModelAttribute(@ModelAttribute("abc") User user){
       System.out.println("testModelAttribute执行了...");
       System.out.println(user);
       return "success";
   }

   @ModelAttribute
   public void showUser(String uname, Map<String,User> map){
       System.out.println("showUser执行了...");
       // 通过用户查询数据库(模拟)
       User user = new User();
       user.setUname(uname);
       user.setAge(20);
       user.setDate(new Date());
       map.put("abc",user);
   }

   /**
    * 该方法会先执行

   @ModelAttribute
   public User showUser(String uname){
       System.out.println("showUser执行了...");
       // 通过用户查询数据库(模拟)
       User user = new User();
       user.setUname(uname);
       user.setAge(20);
       user.setDate(new Date());
       return user;
   }
    */


SessionAttribute  多次执行控制器方法间的参数共享

作用: 用于多次执行控制器方法间的参数共享。 属性: value:用于指定存入的属性名称 type:用于指定存入的数据类型。

 <a href="anno/testSessionAttributes">testSessionAttributes</a>
 <a href="anno/getSessionAttributes">getSessionAttributes</a>
 <a href="anno/delSessionAttributes">delSessionAttributes</a>
@Controller
@RequestMapping("/anno")
@SessionAttributes(value={"msg"})   // 把msg存入到session域对中
public class AnnoController {
}
/**
    * SessionAttributes的注解
    * @return
    */
   @RequestMapping(value="/testSessionAttributes")
   public String testSessionAttributes(Model model){
       System.out.println("testSessionAttributes...");
       // 底层会存储到request域对象中
       model.addAttribute("msg","美美");
       return "success";
   }

   /**
    * 获取值
    * @param modelMap
    * @return
    */
   @RequestMapping(value="/getSessionAttributes")
   public String getSessionAttributes(ModelMap modelMap){
       System.out.println("getSessionAttributes...");
       String msg = (String) modelMap.get("msg");
       System.out.println(msg);
       return "success";
   }

   /**
    * 清除
    * @param status
    * @return
    */
   @RequestMapping(value="/delSessionAttributes")
   public String delSessionAttributes(SessionStatus status){
       System.out.println("getSessionAttributes...");
       status.setComplete();
       return "success";
   }


RestController  不走视图解析器直接返回字符串

在类上使用



RestFul 风格

这时浏览器输入的url 就是  http://localhost:8080/t1/aaaa/bbbb

aaaa和bbbb 就是输入的参数

@RequestMapping("/t1/{aa}/{bb}")
   public String t1(@PathVariable String aa,@PathVariable String bb, HttpServletRequest req){
       String s = aa + bb;
       req.setAttribute("hhh","合并字符串为"+s);

       return "wahh";
   }


转发和重定向

转发

@RequestMapping("/t4")
   public String t4(Map<String,String> mp){
       mp.put("whh","转发的页面");
       return "wahh";
   }


重定向

@RequestMapping("/t5/{name}")
   public String t5(@PathVariable String name,HttpServletRequest req, HttpServletResponse rsp){
       //重定向的页面
       req.getSession().setAttribute("name", name);
       //重定向调用的是其他方法的 URL
       return "redirect:/t4";
   }



向后台参数的传递

传递的参数一般要名字一致


通过map传递

@RequestMapping("/wahh")  //url
   public String getHome(Map<String,String> mp){
       mp.put("whh","/wahh");

       return "wahh";
   }


通过对象传递

@GetMapping("/u2")public String test2(User user){
   System.out.println(user);  
   return "test1";
}


通过request传递

@RequestMapping("/hhh")
   public String gethhh(HttpServletRequest req){
        req.setAttribute("hhh","阿弥陀佛");

       return "wahh";
   }


通过基本类型传递

有String  boolean   Integer int 等

@RequestMapping("/hhh")
   public String gethhh(String sss){
        System.out.println(sss);  

       return "wahh";
   }


向前端的返回数据


第一种  ModelAndView


public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {

       ModelAndView mv=new ModelAndView();
       Student student=new Student();
       student.setName("哇哈哈");
       mv.addObject("student",student);
       mv.setViewName("wahh");
       return mv;

   }


第二种  Model

@GetMapping("/u1")
   public String test1( Model model){
       //将返回的结果传递给前端,model
       model.addAttribute("msg","name");
       //视图跳转
       return "test1";
   }


第三种  ModelMap

LinkedHashMap-->>ModelMap-->>model      上下关系
ModelMap  继承了LinkedHashMap,拥有它的全部功能
Model     精简版(大部分情况下,我们都直接使用Model)    @GetMapping("/u3")
   public String test3(ModelMap map){

       map.addAttribute("name","nameeeee");

       return "test1";

   }


小结

Model  只有寥寥几个方法只适合储存数据,简化了新手对于Model对象的操作和理解

ModelMap  继承了LinkedHashMap,除了实现了自身的一些方法同样继承了LinkedMap的方法和特性

ModelAndView  可以在储存数据的同事,可以进行设置发挥的了逻辑视图,进行控制展示层的跳转


乱码处理

在web.xml中加入

 <!--  解决参数乱码问题-->
 <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>
 </filter>
 <filter-mapping>
   <filter-name>characterEncodingFilter</filter-name>
   <url-pattern>/*</url-pattern>
 </filter-mapping>


JSON

json键值对是用来保存 JavaScript 对象的一种方式,和  JavaScript 对象的写法也大同小异,键/值对组合中的键名写在前面并用双引号 "" 包裹,使用冒号:分隔,然后紧接着值:

{"name":"adsfasdfasdfasd"}

{"age":"6"}

{"sex":"难"}

JSON 和 JavaScript 对象可以互转

要实现从JSON字符串转换为JavaScript 对象,使用 JSON.parse() 方法:

var obj = JSON.parse('{"a": "Hello", "b": "World"}');
//结果是 {a: 'Hello', b: 'World'}

要实现从JavaScript 对象转换为JSON字符串,使用 JSON.stringify() 方法:

var json = JSON.stringify({a: 'Hello', b: 'World'});
//结果是 '{"a": "Hello", "b": "World"}'


json乱码处理   在spring配置文件下添加配置

<!--    json乱码解决-->
   <mvc:annotation-driven>
       <mvc:message-converters>
           <bean class="org.springframework.http.converter.StringHttpMessageConverter">
               <constructor-arg value="UTF-8"/>
           </bean>
           <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
               <property name="objectMapper">
                   <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                       <property name="failOnEmptyBeans" value="false"/>
                    </bean>
               </property>
           </bean>
       </mvc:message-converters>
   </mvc:annotation-driven>


返回 json 对象

 <!--pom.xml导入依赖-->
 <dependency>
           <groupId>com.fasterxml.jackson.core</groupId>
           <artifactId>jackson-databind</artifactId>
           <version>2.11.0</version>
       </dependency>


   @RequestMapping("/js1")
   @ResponseBody  //不走视图解析器直接返回
   public String json1() throws JsonProcessingException {
       ObjectMapper mapper = new ObjectMapper();
       User user = new User();
       String s = mapper.writeValueAsString(user);
       return s;
   }


Fastjson

导入依赖

 <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>fastjson</artifactId>
           <version>1.2.73</version>
       </dependency>


jsonobject 代表 json 对象


jsonarray 代表 json 对象数组


json 代表 jsongobject 和 jsonarray 的转化



SpringMVC的评论 (共 条)

分享到微博请遵守国家法律