1. 程式人生 > 其它 >SpringMVC基本使用

SpringMVC基本使用

技術標籤:Spring MVCspringspringmvcjava

文章目錄

一、初步使用SpringMVC

  建立一個dynamic web project,匯入相應的jar到WebContent/WEB-INF/lib目錄,jar示例:

  接著在WEB-INF目錄下建立 web.xml,該檔案中配置充當DispatcherServlet的資訊,示例:

<?xml version="1.0" encoding="UTF-8"
?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <servlet-name>
springmvc</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-
name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>

  然後在WEB-INF目錄下建立 springmvc-servlet.xml,將具體的訪問路徑與具體的Controller對應,示例:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <bean id="simpleUrlHandlerMapping"
        class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/index">indexController</prop>
            </props>
        </property>
    </bean>
    <bean id="indexController" class="controller.IndexController"></bean>
</beans>

  建立 IndexController,用來處理具體的請求,在handleRequest方法裡,用ModelAndView 物件把模型和檢視結合在一起(表示檢視是index.jsp,模型資料是 message),示例:

package controller;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
 
public class IndexController implements Controller {
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mav = new ModelAndView("index.jsp");
        mav.addObject("message", "Hello Spring MVC");
        return mav;
    }
}

  在WebContent目錄下建立index.jsp,用於顯示內容,示例:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false"%>
 
<h1>${message}</h1>

  接下來就可以進行測試了,訪問:

http://127.0.0.1:8080/springmvc/index

  測試結果:

二、檢視定位

  在上個小節中,inde.jsp檔案是直接建立WebContent目錄下的,我們可以規範些,改變一下其位置,比如在WEB-INF/page目錄下,首先就要在springmvc-servlet.xml指定一下.jsp檔案的位置,示例:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
 
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/" />
        <property name="suffix" value=".jsp" />
    </bean>
 
    <bean id="simpleUrlHandlerMapping"
        class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/index">indexController</prop>
            </props>
        </property>
    </bean>
    <bean id="indexController" class="controller.IndexController"></bean>
</beans>

  然後將IndexController類的這一行程式碼:

ModelAndView mav = new ModelAndView("index.jsp");

  改成:

ModelAndView mav = new ModelAndView("index");

  最後將index.jsp移動到 WEB-INF/page 目錄下,重新訪問:

http://127.0.0.1:8080/springmvc/index

  結果依然與之前一樣:

三、使用註解

  前面的小節都是用配置檔案的方式實現功能的,接下來試試註解的方式。首先在Controller中獎賞註解,表明註解的名稱對應的訪問路徑,示例:

package controller;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
 
@Controller
public class IndexController {
    @RequestMapping("/index")
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mav = new ModelAndView("index");
        mav.addObject("message", "Hello Spring MVC");
        return mav;
    }
}

  接下來在springmvc-servlet.xml中加入下面一句:

<context:component-scan base-package="controller" />

  表明從包controller下掃描有@Controller註解的類,示例:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
 
 	<context:component-scan base-package="controller" />
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/" />
        <property name="suffix" value=".jsp" />
    </bean>
 
</beans>

  重新訪問:

http://127.0.0.1:8080/springmvc/index

  結果依然與之前一樣。

四、接受表單資料

  瀏覽器提交資料是非常常見的場景,本小節演示Spring MVC如何接受資料。先建立實體類:

package pojo;
 
public class Product {
 
    private int id;
    private String name;
    private float price;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public float getPrice() {
        return price;
    }
    public void setPrice(float price) {
        this.price = price;
    }
}

  然後在WebContent目錄下 增加商品的頁面addProduct.jsp,用於使用者填寫資料,示例:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%>
 
<form action="addProduct">
 
    產品名稱 :<input type="text" name="name" value=""><br />
    產品價格: <input type="text" name="price" value=""><br />
 
    <input type="submit" value="增加商品">
</form>

  接著建立控制器ProductController,準備一個add方法對映/addProduct路徑
,為add方法準備一個Product 引數,用於接收注入,最後跳轉到showProduct頁面顯示使用者提交的資料。示例:

package 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.RequestParam;
import org.springframework.web.servlet.ModelAndView;
 
import pojo.Product;
 
@Controller
public class ProductController {
 
    @RequestMapping("/addProduct")
    public ModelAndView add(Product product) throws Exception {
        ModelAndView mav = new ModelAndView("showProduct");
        return mav;
    }
}

  在上面的程式碼中, addProduct.jsp 提交的name和price會自動注入到引數 product裡, 引數product會預設被當做值加入到ModelAndView 中,相當於:

mav.addObject("product",product);

  在WEB-INF/page 目錄下建立 showProduct.jsp,用於顯示使用者提交的資料:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false"%>
 
產品名稱: ${product.name}<br>
產品價格: ${product.price}

  接下來就可以進行測試,訪問:

http://127.0.0.1:8080/springmvc/addProduct.jsp

  介面為:

  隨便輸入一些商品資訊,如:“Phone”、“3000”,就可以看到如下介面:

五、客戶端跳轉

  之前的小節裡都是服務端跳轉,本小節演示如何進行客戶端跳轉。
  修改IndexController,示例:

@Controller
public class IndexController {
    @RequestMapping("/index")
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mav = new ModelAndView("index");
        mav.addObject("message", "Hello Spring MVC");
        return mav;
    }
     
    @RequestMapping("/jump")
    public ModelAndView jump() {
        ModelAndView mav = new ModelAndView("redirect:/index");
        return mav;
    }  
}

  然後訪問:

http://127.0.0.1:8080/springmvc/jump

  測試結果:

六、Session

  此處簡單從Session中獲取count屬性,然後自增1,並顯示到頁面上,先修改IndexController檔案為:

package controller;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
 
@Controller
public class IndexController {
    @RequestMapping("/index")
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mav = new ModelAndView("index");
        mav.addObject("message", "Hello Spring MVC");
        return mav;
    }
     
    @RequestMapping("/jump")
    public ModelAndView jump() {
        ModelAndView mav = new ModelAndView("redirect:/index");
        return mav;
    }  
    
    @RequestMapping("/check")
    public ModelAndView check(HttpSession session) {
        Integer i = (Integer) session.getAttribute("count");
        if (i == null)
            i = 0;
        i++;
        session.setAttribute("count", i);
        ModelAndView mav = new ModelAndView("check");
        return mav;
    }
     
}

  接著在page目錄下新建check.jsp,示例:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false"%>
 
session中記錄的訪問次數:${count}

  訪問如下地址:

http://127.0.0.1:8080/springmvc/check

  沒重新整理一次,訪問次數就會+1。

七、中文問題

  在之前的提交表單時,我們沒有輸入中文資訊,那假如我們輸入"手機"、"3000"會顯示什麼呢?如下:

  很明顯,編碼格式需要處理。首先要修改web.xml,支援中文編碼,示例:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <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>    
</web-app>

  接著修改addProduct.jsp,為form 設定method=“post”,示例:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%>
 
<form action="addProduct" method="post">
 
    產品名稱 :<input type="text" name="name" value=""><br />
    產品價格: <input type="text" name="price" value=""><br />
 
    <input type="submit" value="增加商品">
</form>

  重新測試,就發現支援中文了,測試結果:

八、上傳檔案

  首先要在web.xml中增加對上傳圖片的相關配置,比如格式等,此處以jpg為例,並且關於上傳圖片的配置需要加在springmvc的servlet之前,示例:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.jpg</url-pattern>
    </servlet-mapping>
     
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <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>    
</web-app>

  然後需要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"
    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">
     
    <context:component-scan base-package="controller" />
    <bean id="irViewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/" />
        <property name="suffix" value=".jsp" />
    </bean>
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
</beans>

  接著在WebContent目錄下,建立upload.jsp,用於上傳圖片,示例:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%>
  
<form action="uploadImage" method="post" enctype="multipart/form-data">
  選擇圖片:<input type="file" name="image" accept="image/*" /> <br>
  <input type="submit" value="上傳">
</form>

  圖片上傳後,自然要接受這張圖片,示例:

package pojo;
 
import org.springframework.web.multipart.MultipartFile;
 
public class UploadedImageFile {
    MultipartFile image;
 
    public MultipartFile getImage() {
        return image;
    }
 
    public void setImage(MultipartFile image) {
        this.image = image;
    }
}

  需要注意的是:在UploadedImageFile中封裝MultipartFile型別的欄位 image ,用於接受頁面的注入。這裡的欄位 image必須和上傳頁面upload.jsp中的image
< input type=“file” name=“image” accept=“image/*” />保持一致。
  接著就要建立一個Controller,來負責實現接受圖片、傳給介面等功能,示例:

package controller;
 
import java.io.File;
import java.io.IOException;
 
import javax.servlet.http.HttpServletRequest;
 
import org.apache.commons.lang.xwork.RandomStringUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
 
import pojo.UploadedImageFile;
 
@Controller
public class UploadController {
 
    @RequestMapping("/uploadImage")
    public ModelAndView upload(HttpServletRequest request, UploadedImageFile file)
            throws IllegalStateException, IOException {
        String name = RandomStringUtils.randomAlphanumeric(10);
        String newFileName = name + ".jpg";
        File newFile = new File(request.getServletContext().getRealPath("/image"), newFileName);
        newFile.getParentFile().mkdirs();
        file.getImage().transferTo(newFile);
 
        ModelAndView mav = new ModelAndView("showUploadedFile");
        mav.addObject("imageName", newFileName);
        return mav;
    }
}

  在上述程式碼中:

  1. 方法的第二個引數UploadedImageFile 中已經注入好了 image
  2. 通過 RandomStringUtils.randomAlphanumeric(10);獲取一個隨機檔名。 因為使用者可能上傳相同檔名的檔案,為了不覆蓋原來的檔案,通過隨機檔名的辦法來規避
  3. 根據request.getServletContext().getRealPath 獲取到web目錄下的image目錄,用於存放上傳後的檔案。
  4. 呼叫file.getImage().transferTo(newFile); 複製檔案
  5. 把生成的隨機檔名提交給檢視,用於後續的顯示

  最後,在WEB-INF/page 下新建檔案showUploadedFile.jsp 顯示上傳的圖片:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false"%>
 
<img src="image/${imageName}"/>

  訪問如下地址:

http://127.0.0.1:8080/springmvc/upload.jsp

  顯示的介面為:

  然後選擇jpg檔案進行上傳,即可在網頁上顯示。

  
  本文內容均參考HOW2J.CN