初識(shí) Spring MVC——練手小項(xiàng)目

這篇文章轉(zhuǎn)載自我的個(gè)人博客

初始Spring MVC

前幾天開始了我的spring學(xué)習(xí)之旅,由于之前使用過MVC模式來做項(xiàng)目,所以我先下手的是 Spring MVC,做個(gè)練手項(xiàng)目,非常簡(jiǎn)單

項(xiàng)目介紹:

用戶輸入信息 -> 后臺(tái)處理 -> 輸出信息

開始
  1. 創(chuàng)建Spring MVC 項(xiàng)目(創(chuàng)建時(shí)下載所需文件)




2.創(chuàng)建完的項(xiàng)目目錄是這樣的



  1. 配置Web項(xiàng)目結(jié)構(gòu)

參考另一篇文章IDEA如何創(chuàng)建及配置Web項(xiàng)目(多圖)

有變化的是: 不需要自己創(chuàng)建 lib 文件夾,在創(chuàng)建項(xiàng)目時(shí)已經(jīng)建立,另外在 WEB-INF 建立 jsp 用于存放 .jsp 文件,其他的都沒什么區(qū)別

配置完的樣子(文件夾旁有箭頭是因?yàn)槲以谧鐾觏?xiàng)目才截圖,具體的類以及其他文件都已在內(nèi)):



  1. 配置Spring MVC的核心 —— dispatcher-servlet.xml

Spring MVC provides an annotation-based programming model where @Controller and @RestController components use annotations to express request mappings, request input, exception handling, and more. Annotated controllers have flexible method signatures and do not have to extend base classes nor implement specific interfaces.

如官方文檔所說,我也使用了注解來定義控制器(Controller)和服務(wù)(Service).

首先需要添加的是

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

這樣我們就能通過注解來定義Controller以及Service.

然后,我們需要配置視圖解析器,在具體操作時(shí)只要寫出視圖的名稱(xxx),就可以采用URL拼接的方式,達(dá)到這種效果:/WEB-INF/jsp/xxx.jsp

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>
  1. 開始進(jìn)行具體的操作

首先是基本數(shù)據(jù)類:

public class Product {
    private long id;
    private String name;
    private String price;
    private String inventory;

    public void setId(long id) {
        this.id = id;
    }
    public long getId() {
        return id;
    }

    public void setName(String name) {
        this.name = name;
    }
    public String getName() { return name; }
    public void setPrice(String price) {
        this.price = price;
    }
    public String getPrice() { return price; }
    public void setInventory(String inventory) {
        this.inventory = inventory;
    }
    public String getInventory() { return inventory; }
}


接下來是收集用戶輸入所需要的表單類:

public class ProductForm {
    private String name;
    private String price;
    private String inventory;
    public void setName(String name) {
        this.name = name;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public void setInventory(String inventory) {
        this.inventory = inventory;
    }

    public String getName() {
        return name;
    }
    public String getPrice() {
        return price;
    }
    public String getInventory() {
        return inventory;
    }
}


然后編寫服務(wù)接口,以及它的實(shí)現(xiàn)類

import domain.Product;

public interface ProductService {
    Product add(Product product);
    Product get(long id);
}

ProductServiceImpl就是剛才配置的服務(wù)(Service)

import domain.Product;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;

@Service
public class ProductServiceImpl implements ProductService{
    private Map<Long, Product> productMap = new HashMap<>();
    private AtomicLong atomicLong = new AtomicLong();

    @Override
    public Product add(Product product){
        long id = atomicLong.incrementAndGet();
        product.setId(id);
        productMap.put(id, product);
        return product;
    }

    @Override
    public Product get(long id){
        return productMap.get(id);
    }
}


最重要的是控制器

采用@Autowired注解的方式自動(dòng)裝配Service,
使用@RequestMapping注解的方式,將注解中的路徑映射到控制器:

import domain.Product;
import form.ProductForm;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import service.ProductService;

@Controller
public class ProductController {
    //日志記錄具體操作
    private static final Log logger = LogFactory.getLog(ProductController.class);

    @Autowired
    private  ProductService productService;

    //method = RequestMethod.POST表示只接受POST形式的請(qǐng)求
    @RequestMapping(value = "/product_save", method = RequestMethod.POST)
    //采用POST的方式發(fā)送請(qǐng)求
    public String saveProduct(ProductForm productForm, RedirectAttributes redirectAttributes){
        logger.info("saveProduct called");

        //獲得用戶輸入
        Product product = new Product();
        product.setName(productForm.getName());
        product.setPrice(productForm.getPrice());
        product.setInventory(productForm.getInventory());

        //添加有記錄的產(chǎn)品,并且根據(jù)ID進(jìn)行重定向
        Product savedProduct = productService.add(product);
        redirectAttributes.addFlashAttribute("message", "Add product Successfully");
        return "redirect:/product_view/" + savedProduct.getId();
    }

    //根據(jù)ID,將用戶輸入展示在ProductView中
    @RequestMapping(value = "product_view/{id}")
    public String viewProduct(@PathVariable Long id, Model model){
        //根據(jù)ID得到信息
        Product product = productService.get(id);
        model.addAttribute("product", product);
        //ProductView.jsp
        return "ProductView";
    }
}



需要注意的是,在現(xiàn)在的Spring版本中,如果直接對(duì)Service進(jìn)行注解,將會(huì)有產(chǎn)生警告:

按住Alt + Enter 修正錯(cuò)誤,會(huì)看見提示:

官方推薦使用構(gòu)造器注入

到此為止,后臺(tái)工作就結(jié)束了

  1. 頁(yè)面

接下來是JSP的編寫:

首先是用戶輸入的頁(yè)面 (ProductForm.jsp)

<body>
    <div>
        <form action="product_save" method="post">
            <fieldset>
                <legend>Add a product</legend>
                <p>
                    <label for="name">Product Name: </label>
                    <input type="text" id="name" name="name">
                </p>
                <p>
                    <label for="price">Price: </label>
                    <input type="text" id="price" name="price">
                </p>
                <p>
                    <label for="inventory">Inventory: </label>
                    <input type="text" id="inventory" name="inventory">
                </p>
                <p>
                    <input id="reset" type="reset" tabindex="4">
                    <input id="submit" type="submit" tabindex="5" value="Add Product">
                </p>
            </fieldset>
        </form>
    </div>
</body>

比較表單中的<form action="product_save">
和控制器中的@RequestMapping(value = "/product_save")就能夠知道,通過@RequestMapping注解,任何"/product_save"開頭的路徑都會(huì)被映射到控制器中,并采用saveProduct()方法

然后是顯示用戶輸入的頁(yè)面 (ProductView.jsp)

<body>
    <div>
        <h3>${message}</h3>
        <h4>Details:</h4>
        Product Name: ${product.name}<br>
        Price: ${product.price}<br>
        Inventory: ${product.inventory}<br>
    </div>
</body>

${message}就是剛才在控制器中重定向頁(yè)面的屬性,它會(huì)在頁(yè)面頭部輸出"Add product Successfully"

項(xiàng)目構(gòu)建完畢

最終的目錄結(jié)構(gòu)是這樣:

然后我們運(yùn)行, 輸入:

頁(yè)面難看,主要是用Spring MVC做出來的就可以了

結(jié)果是這樣的:

目光移至URL,填寫信息提交后,頁(yè)面重定向至 product_view/{id} 處,當(dāng)前id = 1

到處,我們的這個(gè)練手的小項(xiàng)目就結(jié)束了,有什么問題都可以私信我

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,688評(píng)論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,284評(píng)論 6 342
  • 1、Spring MVC請(qǐng)求流程 (1)初始化:(對(duì)DispatcherServlet和ContextLoderL...
    拾壹北閱讀 2,020評(píng)論 0 12
  • 、最好的事情莫過于回到溫暖的宿舍里,看著一群溫暖的你們。雖然每天的任務(wù)很繁瑣,但還好我們?cè)谝黄鹈鎸?duì)。體育課上,正在...
    聽過許多心里話閱讀 373評(píng)論 0 0
  • 關(guān)鍵詞:權(quán)利要求書、說明書、項(xiàng)目組織、寫作流程、發(fā)表流程 1. 工作描述 專利申報(bào)是科學(xué)研究與技術(shù)研究成果認(rèn)證和保...
    馬騁閱讀 1,376評(píng)論 0 7

友情鏈接更多精彩內(nèi)容