springmvc

springmvc:是一个轻量级的,基于请求响应的mvc框架。

实例类:

package com.tedu.pojo;

public class User {
 private String name;
 private Integer age;
 private String  addr;
 public User() {
    }
public User(String name, Integer age, String addr) {
    this.name = name;
    this.age = age;
    this.addr = addr;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public Integer getAge() {
    return age;
}
public void setAge(Integer age) {
    this.age = age;
}
public String getAddr() {
    return addr;
}
public void setAddr(String addr) {
    this.addr = addr;
}
@Override
public String toString() {
    return "User [name=" + name + ", age=" + age + ", addr=" + addr + "]";
    
}
 
}

springmvc-config.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:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc
                        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
                        http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                        http://www.springframework.org/schema/context
                          http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    
    <!-- 1.配置前端控制器放行静态资源(html/css/js等,否则静态资源将无法访问) -->
    <mvc:default-servlet-handler/>
    
    <!-- 2.配置注解驱动,用于识别注解(比如@Controller) -->
    <mvc:annotation-driven></mvc:annotation-driven>
    
    <!-- 3.配置需要扫描的包:spring自动去扫描 base-package 下的类,
        如果扫描到的类上有 @Controller、@Service、@Component等注解,
        将会自动将类注册为bean 
     -->
    <context:component-scan base-package="com.tedu.controller"></context:component-scan>
    
    <!-- 4.配置内部资源视图解析器
        prefix:配置路径前缀
        suffix:配置文件后缀
     -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    
    
</beans>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name>day16-springmvc</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <!--配置springmvc的前端控制器(DispatherServlet) -->
  <servlet >
   <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 配置springmvc核心配置文件的位置 -->
  <init-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:springmvc-config.xml</param-value>
  </init-param>
  </servlet>
  <servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <!--拦截除了jsp以外的其他请求 -->
  <url-pattern>/</url-pattern>
  </servlet-mapping>
  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
  
  
</web-app>

测试类:

package com.tedu.controller;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.tedu.pojo.User;

@Controller
public class HelloController {
    //http://localhost:8080/day16-springmvc/hello
    @RequestMapping("/hello")
    public String hello() {
        System.out.println("hello springmvc...");
        return "home";
    }

  /*1.springmvc参数绑定
   * 基本数据类型绑定
   * 
   * */
    @RequestMapping("/testParam1")
    public String testParam1(String name, Integer age, String addr) {
        System.out.println("HelloController.testParam1");
        System.out.println("name="+name);
        System.out.println("age="+age);
        System.out.println("addr="+addr);
        return "home";
    
}
    @RequestMapping("/testParam2")
    public String testParam2(User user) {
       System.out.println(user);
        return "home";
    
}
    @RequestMapping("/testparam3")
    public String param3(Date date){
        System.out.println("date="+date.toLocaleString());
        return "home";
    }
    /* 自定义日期转换格式 */
    @InitBinder
    public void InitBinder (ServletRequestDataBinder binder){
        binder.registerCustomEditor(java.util.Date.class, 
            new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), true)
        );
    }
    /* 测试请求转发(forward) */
    @RequestMapping("/testForward")
    public String testForward() {
        
        System.out.println("HelloController.testForward()");
        return "forward:/hello";
    }
    /* 测试请求重定向(Readirect) */
    @RequestMapping("/testRedirect")
    public String testRedirect() {
        
        System.out.println("HelloController.testRedirect()");
        return "redirect:/hello";
    }
    /* 测试Post提交的中文参数是否存在乱码问题 */
    /* 测试请求重定向(Readirect) */
    @RequestMapping("/testGet")
     public String testGet(String username, String[] like) {
        System.out.println(username);
        System.out.println(Arrays.toString(like));
        return "home";
    }
    @RequestMapping("/testPost")
    public String testPost(String username, String[] like) {
        System.out.println(username);
        System.out.println(Arrays.toString(like));
            return "home";
    }
    
    /*响应数据(Model和JSON)*/
    /**当浏览器访问/testModel时,
     * 在方法中获取到的User对象转发带到home.jsp,在JSP中取出并显示
     * */
    @RequestMapping("/testModel")
    public String testModel(Model model) {
        User user = new User(小明",30,"泰国");
        User user1 = new User("小亮",30,"泰国");
        List<User> list = new ArrayList<>();
        list.add(user);
        list.add(user1);
        model.addAttribute("user", user);
            return "home";
    }
    @RequestMapping("/testModel2")
    public String testModel2(Model mode2) {
        User user = new User("小明",30,"泰国");
        User user1 = new User("小亮",30,"日本");
        List<User> list = new ArrayList<>();
        list.add(user);
        list.add(user1);
        mode2.addAttribute("list", list);
            return "home";
    }
    
    /*测试响应数据JSON1*/
    @RequestMapping("/testJSON1")
    @ResponseBody
    public User testJSON1() {
     User user = new User("小王",30,"泰国");
            return user;
    }
    /*测试响应数据JSON2*/
    @RequestMapping("/testJSON2")
    @ResponseBody
    public List<User> testJSON2() {
        List<User> list = new ArrayList<>();
        list.add(new User("小明",30,"美国国"));
        list.add(new User("小王",30,"泰国"));
        list.add(new User("小狼",30,"日本"));
           return list;
    }
}

jsp页面

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>hello springmvc~~~</h1>
<hr/>
${user.name}
${user.age}
${user.addr}
<hr/>
<c:forEach items="${list}" var="user">
${user.name}:${user.age}:${user.addr}<br/>
</c:forEach>

</body>
</html>

 通用页面跳转

/* 通用的页面跳转方法*/
    @RequestMapping("/{pageName}")
    public String toPage(@PathVariable String pageName) {
        return pageName;
    }

 

 

 

 mvc设计模式

MVC设计模式是一种通用的软件编程思想
在MVC设计模式中认为, 任何软件都可以分为三部分组成:
(1)控制程序流转的控制器(Controller)
(2)封装数据处理数据的模型(Model)
(3)负责展示数据的视图(view)
并且在MVC设计思想中要求一个符合MVC设计思想的软件应该保证上面这三部分相互独立,互不干扰,每一个部分只负责自己擅长的部分。
如果某一个模块发生变化,应该尽量做到不影响其他两个模块。这样做的好处是,软件的结构会变得更加的清晰,可读性强。有利于后期的扩展和维,并且代码可以实现复用。

 

springmvc的核心组件:

前端控制器DispatcherServlet

作用:接收请求,响应结果,相当于转发器,中央处理器。有了dispatcherServlet减少了其它组件之间的耦合度。

处理器映射器HandlerMapping
作用:根据请求的url查找Handler
HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

处理器适配器HandlerAdapter
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

处理器Handler
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发Handler。

ViewResolver:视图解析器
作用:负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,
再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
 
 
 

第一步:发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求HandlerMapping查找Handler可以根据xml配置、注解进行查找
第三步:处理器映射器HandlerMapping向前端控制器返回Handler
第四步:前端控制器调用处理器适配器去执行Handler
第五步:处理器适配器去执行Handler
第六步:Handler执行完成给适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView。ModelAndView是springmvc框架的一个底层对象,包括 Model和view
第八步:前端控制器请求视图解析器去进行视图解析,根据逻辑视图名解析成真正的视图(jsp)
第九步:视图解析器向前端控制器返回View
第十步:前端控制器进行视图渲染。视图渲染将模型数据(在ModelAndView对象中)填充到request域
第十一步:前端控制器向用户响应结果

 

posted on 2019-10-09 14:27  棽犹  阅读(167)  评论(0编辑  收藏  举报

导航