1. 程式人生 > >spring-構建mvc工程

spring-構建mvc工程

stack erl 另一個 分享圖片 fir owa img rect contex

SpringMVC基於模型-視圖-控制器(MVC)模式實現,可以構建松耦合的web應用程序。

1、SpringMVC的請求過程

技術分享圖片

1)請求離開瀏覽器,並攜帶用戶所請求的內容

2)DispatcherServlet角色為調度員(前端控制器)。查詢一個或多個處理器映射確定處理請求的控制器

3)將請求發給選中的控制器業務處理

4)控制器處理完成後,將業務數據封裝為模型,並指定一個邏輯視圖名,一起返回給DispatcherServlet

5)DispatcherServlet將邏輯視圖名匹配一個特定視圖實現

6)使用模型數據渲染出指定的視圖

7)返給前端展示

2、springMVC工程配置

web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>

    <!--<context-param>-->
        <!--<param-name>contextConfigLocation</param-name>-->
        <!--<param-value>classpath:applicationContext.xml</param-value>-->
    <!--</context-param>-->
    <!--<listener>-->
        <!--<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>-->
    <!--</listener>-->
    
    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springMvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

springMvc.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:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
     
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 掃描控制器 --> <context:component-scan base-package="com.cn.controller"></context:component-scan> <!-- 處理器映射 --> <mvc:annotation-driven></mvc:annotation-driven> <!-- 視圖解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"></property> <property name="suffix" value=".jsp"></property> </bean> </beans>

3、控制器

 接受參數的方式

  • 查詢參數
  • 表單參數
  • 路徑變量

控制器

package com.cn.controller;

import com.cn.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.validation.Valid;


@Controller
public class HelloController {

   @RequestMapping("/home")
   public String home(){
       System.out.println("執行home");
       return "home"; //返回一個字符串,即邏輯視圖名
   }

    @RequestMapping("/home2")
    public String home2(){
        System.out.println("執行home2");
        return "redirect:home3"; //含有redirect的字符串,表示重定向到另一個處理器;
                                 //如果含有forward的字符串,表示轉向到另一個處理器
    }

    @RequestMapping("/home3")
    public String home3(){
        System.out.println("輸出home");
        return "home3";
    }

    @RequestMapping("/show3")   //表單參數,,@Valid註解與添加了校驗註解的User配合使用
    public String showPerson3(@Valid User user, Errors errors){//Errors參數必須緊跟@Valid的參數 
        if (errors.hasErrors()){//校驗是否有校驗未通過的參數
            System.out.println("表單元素校驗不通過");
            return "fail";
        }
        System.out.println("用戶信息:"+user);
        return "success";
    }

    @RequestMapping("/{name}/{age}")    //路徑參數  http://localhost:8080/tt/123 輸出:名稱:tt 年齡:123;;
    public String showPerson2(@PathVariable(value = "name") String name,
                            @PathVariable(value = "age") String age){
        System.out.println("名稱:"+name+" 年齡:"+age);
        return "success";
    }
   
    @RequestMapping("/show")    //查詢參數   http://localhost:8080/show?name=pp&age=99 輸出:名稱:pp 年齡:99;;
    public String showPerson(@RequestParam(value = "name", defaultValue = "laowang") String name,
                           @RequestParam(value = "age", defaultValue = "100") String age){
        System.out.println("名稱:"+name+" 年齡:"+age);
        return "success";
    }

}

POJO

package com.cn.pojo;

import com.sun.istack.internal.NotNull;

import javax.validation.constraints.Size;


public class User {
  //表單參數校驗
    @NotNull
    @Size(min = 6,max = 10)
    private String firstName;
    @NotNull
    @Size(min = 6,max = 10)
    private String lastName;
    @NotNull
    @Size(min = 6,max = 10)
    private String name;
    @NotNull
    @Size(min = 6,max = 10)
    private String passwd;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {

        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPasswd() {
        return passwd;
    }

    public void setPasswd(String passwd) {
        this.passwd = passwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "firstName=‘" + firstName + ‘\‘‘ +
                ", lastName=‘" + lastName + ‘\‘‘ +
                ", name=‘" + name + ‘\‘‘ +
                ", passwd=‘" + passwd + ‘\‘‘ +
                ‘}‘;
    }
}

4、視圖解析器

  • 在控制器中返回的字符串(不包含redirect、forward)表示邏輯視圖名,而不會調用具體的視圖實現。spring的視圖解析器能夠決定使用哪種視圖實現去渲染模型。SpringMvc定義了一個ViewResolver 接口,返回為View對象
public interface ViewResolver {
    View resolveViewName(String var1, Locale var2) throws Exception;
}

View接口定義,其中render方法接受模型、request、response參數,並將模型數據渲染到response中

public interface View {
    String RESPONSE_STATUS_ATTRIBUTE = View.class.getName() + ".responseStatus";
    String PATH_VARIABLES = View.class.getName() + ".pathVariables";
    String SELECTED_CONTENT_TYPE = View.class.getName() + ".selectedContentType";

    String getContentType();

    void render(Map<String, ?> var1, HttpServletRequest var2, HttpServletResponse var3) throws Exception;
}
  • 視圖解析器的實現

Spring提供了ViewResolver 多個內置的實現,比如InternalResourceViewResolver、TilesViewResolver...其中InternalResourceViewResolver(最簡單、最常用的視圖解析器將視圖解析為Web應用的內部資源(一般為jsp)

  • 創建JSP視圖

Spring支持兩種JSP視圖的方式---使用InternalResourceViewResolver

方式1:在頁面中使用JSP標準標簽庫(JSTL),InternalResourceViewResolver能夠將視圖名解析為JstlView形式的JSP文件

方式2:使用Spring提供的JSP標簽庫(兩個:一個用於表單到模型的綁定;另一個提供了通用工具類特性)

a、配置適用於JSP的視圖解析器

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/jsp/"></property>   
   <property name="suffix" value=".jsp"></property>
</bean>

  控制器中返回的字符串與該配置中的前後綴拼接成完成的文件路徑,控制器中返回的字符串如果包含了斜線,則可以區分出了不同的目錄。該配置會將邏輯視圖名解析為InternalResourceView實例。

如過JSP中使用JSTL標簽來處理內容,則希望視圖解析器將視圖解析為JstlView實例。僅僅添加一行配置文件即可:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
   <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
   <property name="prefix" value="/WEB-INF/jsp/"></property>
   <property name="suffix" value=".jsp"></property>
</bean>

b、Spring的JSP的標簽庫

...

spring-構建mvc工程