1. 程式人生 > >SpringMvc的Url對映和傳參案例

SpringMvc的Url對映和傳參案例

package sy.controller;



import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.UUID;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import org.apache.commons.io.IOUtils;
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.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import org.springframework.web.servlet.ModelAndView;


import power.FuncConstants;
import power.Permission;
import sy.bean.TestPerson;


// 用來標註此類事springMVC管理的控制層的類
@Controller
// 為了防止多個控制層類有相同的方法所以要為每個控制層類起個唯一的標示名
@RequestMapping(value = "/test")
// @Scope("prototype") ,如果不加這個註釋那麼該controller就是單列的,一般我們不在controller當中定義成員變數所以不用加這個註釋,struts2中的action中會加這個註釋就是因為裡面經常會定義成員變數,如果不加這個註釋當有多個請求的時候就會照成資料共享錯誤
public class TestController {


    @RequestMapping("/hello.do")
    // 訪問此方法的url路徑/test/hello.do
    public String hello() {
        return "index";
    }


    // ===========================獲取頁面中傳進來的引數=======================================================
    /**
     * 方式一:通過request請求方式接收前臺頁面傳過來的引數
     */
    @RequestMapping("/toPerson1.do")
    // 訪問此方法的url路徑為/test/toPerson1.do
    public String toPerson1(HttpServletRequest request) {
        String name = request.getParameter("name");
        System.out.println(name);
        return "index";
    }


    /**
     * 方式二:通過相匹配的引數列表接收頁面引數_String,
     * 而且在頁面引數和引數列表中的引數型別相容的情況下是可以自動型別轉換的_Integer
     *  時間型別如果傳入的時間格式比較特殊可以通過自定義專門的轉換器來解決(屬性編輯器)
     */
    @RequestMapping("/toPerson2.do")
    // 訪問此方法的url路徑為/test/toPerson2.do
    public String toPerson2(String name, Integer age, Date birthday) {
        System.out.println("姓名:" + name + ",年齡:" + age + ",生日" + birthday);
        return "index";
    }
    /**
     * 方式2.1 如果你頁面傳入的和用於接收的非要不一樣那麼可以用@RequestParam指定
     */
    @RequestMapping("/toPerson21.do")
    // 訪問此方法的url路徑為/test/toPerson21.do
    public String toPerson21(@RequestParam("name") String userName, Integer age, Date birthday) {
        System.out.println("姓名:" + userName + ",年齡:" + age + ",生日" + birthday);
        return "index";
    }


    /**
     * 註冊時間型別的屬性編輯器
     */
    @InitBinder
    public void initBinder(ServletRequestDataBinder binder) {
        binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
    }


    /**
     * 方式三:如果頁面傳入的引數和接收的實體類(可以為多個實體)中set方法中的引數一致(首字母大小寫可以不一致),
     * 那麼就可以直接給實體類的屬性賦值,沒有匹配上的將會被賦值為null
     */
    @RequestMapping("/toPerson3.do")
    // 訪問此方法的url路徑為/test/toPerson3.do
    public String toPerson3(TestPerson p) {
        System.out.println(p);
        return "index";
    }


    /**
     * 方式三:如過頁面傳來兩個同名的引數值,方法中可以用一個同名引數陣列去接收,而且接收到的引數順序和傳入時的相同。
     * 如果沒有定義成陣列傳入的引數會以逗號分隔
     */
    @RequestMapping("/toPerson4.do")
    // 訪問此方法的url路徑為/test/toPerson4.do
    public String toPerson4(String[] name) {
        for (int i = 0; i < name.length; i++) {
            System.out.println(name[i]);
        }
        return "index";
    }


    /**
     * 方式四:指定form表單的請求方式,如果不指定,那麼post和get都可以訪問本方法
     *  desc:@RequestMapping( method=RequestMethod.POST )可以指定請求方式,前臺頁面就必須要以它制定好的方式來訪問,否則出現405錯誤
     */
    @RequestMapping(value = "/toPerson5.do", method = RequestMethod.POST)
    public String toPerson5(TestPerson person) {
        System.out.println(person);
        return "index";
    }


    // ===========================向頁面傳遞引數=======================================================
    /**
     * 方式一 desc:方法的返回值採用ModelAndView, new ModelAndView("index", map); ,相當於把結果資料放到request裡面
     */
    @RequestMapping("/toPerson6.do")
    public ModelAndView toPerson6() throws Exception {
        TestPerson person = new TestPerson();
        person.setName("james");
        person.setAge(28);
        person.setAddress("maami");
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date date = format.parse("1985-04-22");
        person.setBirthday(date);
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("p", person);
        return new ModelAndView("index", map);
    }


    /**
     * 方式二 desc:直接在方法的引數列表中來定義Map,這個Map即使ModelAndView裡面的Map, 由檢視解析器統一處理,統一走ModelAndView的介面
     */
    @RequestMapping("/toPerson7.do")
    public String toPerson7(Map<String, Object> map) throws Exception {
        TestPerson person = new TestPerson();
        person.setName("james");
        person.setAge(28);
        person.setAddress("maami");
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date date = format.parse("1985-04-22");
        person.setBirthday(date);
        map.put("p", person);
        return "index";
    }


    /**
     * 方式三 desc:在引數列表中直接定義Model,model.addAttribute("p", person);把引數值放到request類裡面去,建議使用
     */
    @RequestMapping("/toPerson8.do")
    public String toPerson8(Model model) throws Exception {
        TestPerson person = new TestPerson();
        person.setName("james");
        person.setAge(28);
        person.setAddress("maami");
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date date = format.parse("1985-04-22");
        person.setBirthday(date);
        // 把引數值放到request類裡面去
        model.addAttribute("p", person);
        return "index";
    }


    // ===========================Ajax的使用=======================================================
    /**
     * 方式一 :ajax的請求返回值型別應該是void,引數列表裡直接定義HttpServletResponse, 獲得PrintWriter的類,最後可把結果寫到頁面
     */
    @RequestMapping("/ajax.do")
    public void ajax(String name, HttpServletResponse response) {
        String result = "hello " + name;
        try {
            response.getWriter().write(result);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * 方式二 :直接在引數的列表上定義PrintWriter,out.write(result);把結果寫到頁面,建議使用的
     */
    @RequestMapping("/ajax1.do")
    public void ajax1(String name, PrintWriter out) {
        String result = "hello " + name;
        out.write(result);
    }


    // ========================跳轉 轉發和重定向===================================


    @RequestMapping("/redirectToForm.do")
    public String redirectToForm() {
        //同一個類中 desc:controller內部重定向,redirect:加上同一個controller中的requestMapping的值
        return "redirect:upload.do";
        //不同的類中 desc:controller之間的重定向:必須要指定好controller的名稱空間再指定requestMapping的值, redirect:後必須要加/,是從根目錄開始
//        return "redirect:/test/toForm.do";
        //同一個類中 desc:controller內部轉發,redirect:加上同一個controller中的requestMapping的值
//        return "forward:toForm.do";
    }




    // ===========================檔案上傳========================
    @RequestMapping("/upload.do")
    // 訪問此方法的url路徑/test/hello.do
    public String upload() {
        return "fileUpload";
    }
    /**
     * 檔案上傳方式一
     * @param request
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/fileUpload.do")
    public String fileUpload(HttpServletRequest request) throws Exception {
        // 第一步轉化request
        MultipartHttpServletRequest rm = (MultipartHttpServletRequest) request;
        // 獲得原始檔案
        CommonsMultipartFile cfile = (CommonsMultipartFile) rm.getFile("pic");
        // 獲得原始檔名
        String origFileName = cfile.getOriginalFilename();
        // 獲得原始檔案的字尾 XXX.jpg
        String suffix = origFileName.contains(".") ? origFileName.substring(origFileName.lastIndexOf(".")) : "error";
        if ("error".equalsIgnoreCase(suffix)) {
            return "error";
        }
        // 獲得原始檔案的位元組陣列
        byte[] bfile = cfile.getBytes();


        // 新檔名=當前時間的毫秒數+3位隨機數
        String fileName = String.valueOf(System.currentTimeMillis());
        // 獲得三位隨機數
        Random random = new Random();
        for (int i = 0; i < 3; i++) {
            fileName = fileName + random.nextInt(9);
        }
        // 拿到專案的部署路徑
        String path = request.getSession().getServletContext().getRealPath("/");
        // 將使用者上傳的檔案儲存到伺服器上
        OutputStream out = new FileOutputStream(new File(path + "/upload/" + fileName + suffix));
        IOUtils.write(bfile, out);
        out.close();
        return "success";
    }
    /**
     * 檔案上傳方式二
     * @param request
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/fileUpload2.do")
    public String fileUpload2(@RequestParam(value="pc",required=false) MultipartFile file,HttpServletRequest request) throws Exception {
        if(file==null){
            MultipartHttpServletRequest rm = (MultipartHttpServletRequest) request;
            file=rm.getFile("pic");
        }
        String realPath=request.getSession().getServletContext().getRealPath("upload");
        File destFile=new File(realPath+"/"+UUID.randomUUID().toString()+file.getName());
        file.transferTo(destFile);//將上傳上來的臨時檔案移到到我們的目標目錄,File型別的也有類似的renameTo方法移動檔案
        return "success";
    }
}

相關推薦

SpringMvc的Url對映案例

package sy.controller; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; i

flask 渲染jinja2模版

參數 style ont jinja clas turn lte spa 啟動 渲染模版(html文件) A、模版文件(html)放入到template目錄下,項目啟動的時候會從template目錄裏查找, B、從flask中導入“render_tempal

Mybatis中#{}${}的區別

生成 語句 區別 能夠 ole {} sel sele lec 使用#{}傳入參數時,sql語句解析是會加上‘‘。#方式能夠很大程度防止sql註入。 ${}將傳入的數據直接顯示生成在sql中。 例如:select * from user_role where user_co

【python學習筆記】python函式定義方法說明

一、函式定義方式 函式定義用關鍵字def,其引數傳遞不用設定型別,也不用定義返回,然後在函式名稱後加上:號,這點和java很不一樣,相對來說更加簡單了;另外包含關係上用四個空格來標識,而非java的;號; 如下為一個範例,定義了一個函式用來生成任意上界的菲波那契數列: # -*- c

2018年11月11日關於Vue的子路由 and 手動訪問

1、子路由 //在HTML中的相關程式碼 <div id="app"> <div> <router-link to="/">首頁</router-link> <router-link to="/

Linux下tomcat日誌列印亂碼問題

             當前環境: Linux核心:Ubuntu(烏班圖) SSH連線工具:SecureCRT   1、首先確認Linux系統編碼: Linux命令:locale 若查詢結果不是zh_CN.UTF-8,則修改

(六)flask框架使用教程系列——flask渲染jinja2模板

一、如何渲染jinja2模板 模板放在templates資料夾下 從flask中匯入render_template函式 在檢視函式中,使用render_template函式渲染模板。注意:只需要填寫模板的名字,不需要填寫templates這個資料夾的路徑。如果temp

徹底理解JavaScript函式的呼叫方式方式——結合經典面試題

JavaScript函式的呼叫方式和傳參方式 瞭解函式的呼叫過程有助於深入學習與分析JavaScript程式碼。 在JavaScript中,函式是一等公民,函式在JavaScript中是一個數據型別,而非像C#或其他描述性語言那樣僅僅作為一個模組來使用。函式有四種呼叫模式,分別是:函式呼叫形式、

記錄下mybatis中#{}${}的區別

最近在用mybatis,之前用過ibatis,總體來說差不多,不過還是遇到了不少問題,再次記錄下, 比如說用#{},和 ${}傳參的區別, 使用#傳入引數是,sql語句解析是會加上"",比如  select * from table where name = #{nam

mybatis中#$的區別

#{a} 會按照型別替換, 如果a 是string, 那麼最後的結果為‘ssss’ a是文本替換,如果a是String,那麼最後的結果也為ssss,{}主要用在**group by, order by

Mybatis中#{}${}的區別?

"使用#傳入引數" sql語句:select * from emp where empno= #{empNo}; 如果傳入empNo為7369,那麼打印出來的就是 select * from dept where dname =

[轉載]記錄下mybatis中#{}${}的區別

最近在用mybatis,之前用過ibatis,總體來說差不多,不過還是遇到了不少問題,再次記錄下, 比如說用#{},和 ${}傳參的區別, 使用#傳入引數是,sql語句解析是會加上”“,比如  select * from table where name =

flask-Jinja2模板

### Flask渲染Jinja2模板和傳參: 1. 如何渲染模板: * 模板放在`templates`資料夾下 * 從`flask`中匯入`render_template`函式。 * 在檢視函式中,使用`render_template`函式,渲染模板

C#實,以及為什麼實的值通過方法後不會改變

1.值型別   例如:我們定義一個函式   static void Exchange(int x, int y) { int flag = x; flag = y; y = x; x = flag; }其中,int

Fragment建構函式

當試圖重構建構函式時,比如: <span style="font-family:SimSun;font-size:18px;">public StudyFragment(String setHint){ }</span>會提示如下錯誤: Avoid

SpringMVC中controller間跳轉、重定向

1. 需求背景     需求:spring MVC框架controller間跳轉,需重定向。有幾種情況:不帶引數跳轉,帶引數拼接url形式跳轉,帶引數不拼接引數跳轉,頁面也能顯示。 2. 解決辦法     (1)我在後臺一個controller跳轉到另一個controller,為什麼有這種需求呢,是這樣的。

微信小程式微信小程式之間的跳轉示例程式碼附講解

 可以掃碼加我微信,承接小程式開發。 微信小程式開發交流qq群   173683895  、 526474645 ; 正文: 一:微信小程式跳轉 使用限制 需要使用者觸發跳轉 從 2.3.0 版本開始,若使用者未點選小程式頁面任意位置,則開發者將無法呼叫此介面自動

MyBatis的sql對映檔案(陣列集合)

  一、sql對映檔案獲取引數個數 1、獲取單個引數寫法       上篇文章CRUD操作以及使用過單個引數        Mybatis對於只有一個引數的情況下,不會做任何處理,我們對傳遞過來一個id值

關於內存的劃分引用數的區別

如果 引用 也會 對象賦值 空間 函數 代碼段 劃分 剛才 1.堆 2.棧 空間較小 3.全局 4.代碼段 要搞懂每個區域放什麽東西 堆 復雜類型棧 變量靜 代復雜類型對象沒有指針指的時候,堆中的內容垃圾回收1函數傳對象的時候,其實是首先在堆裏面開一個內存放對象屬性

Node paramsquery的Get請求

框架 http 添加屬性 創建 amp app console uid type //1:加載http express框架//2:創建服務器const http = require("http");const express = require("express");var