天天看點

SpringMVC教程2[處理及響應請求]

一、基本操作

1.響應請求的方式

SpringMVC教程2[處理及響應請求]
1.1ModelAndView

/**
     * 查詢方法
     * @return
     */
    @RequestMapping("/query")
    public ModelAndView query(){
        System.out.println("波波烤鴨:query");
        ModelAndView mv = new ModelAndView();
        mv.setViewName("/index.jsp");
        return mv;
    }      

1.2傳回void

傳回值為void時,方法中可以不用做任何傳回,例如下面代碼:

@RequestMapping("/test1")
public void test1() {    
    System.out.println("test1");
}      

此時,在浏覽器端請求/test1接口,springmvc會預設去查找和方法同名的頁面作為方法的視圖傳回。 如果确實不需要該方法傳回頁面,可以使用@ResponseBody注解,表示一個請求到此為止。

@RequestMapping("/test1")
@ResponseBody
public void test1() {    
   System.out.println("test1");
}      

1.3傳回一個字元串

傳回一個真正的字元串

/**
 * 傳回一個字元串
 * @return
 */
@RequestMapping("/hello")
@ResponseBody
public String hello(){
    return "hello";
}      
SpringMVC教程2[處理及響應請求]

傳回一個跳轉頁面名稱

SpringMVC教程2[處理及響應請求]
/**
 * 傳回一個字元串
 * @return
 */
@RequestMapping("/hi")
public String hello(){
    return "/index.jsp";
}      
SpringMVC教程2[處理及響應請求]
<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.3.xsd
        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-4.3.xsd">
    
    <!-- 開啟注解 -->
    <mvc:annotation-driven></mvc:annotation-driven>
    <!-- 開啟掃描 -->
    <context:component-scan base-package="com.dpb.controller"></context:component-scan>
    <!-- 配置視圖解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 配置響應位址的前字尾 -->
        <property name="prefix" value="/user"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>      

響應的代碼:

/**
 * 傳回一個字元串
 * @return
 */
@RequestMapping("/hello")
public String hello1(){
    // 視圖解析器解析的時候會自動拼接上 /user 和  .jsp
    return "/hello";
}      
SpringMVC教程2[處理及響應請求]
SpringMVC教程2[處理及響應請求]
/**
     * 傳回一個字元串
     * @return
     */
    @RequestMapping("/delete")
    public String delete(){
        System.out.println("波波烤鴨:删除資料操作....");
        // 重定向
        return "redirect:/user/query";
    }
    
    /**
     * 
     * @return
     */
    @RequestMapping("/query")
    public String query(){
        System.out.println("波波烤鴨:query");
        
        return "/hello";
    }      
SpringMVC教程2[處理及響應請求]

傳回路徑注意: 傳回的字元帶"/“表示從根目錄下開始找,不帶”/"從目前目錄下查找

1.4通過Request和Response對象處理

/**
 * HttpServletRequest和HttpServletResponse的使用
 * @return
 * @throws IOException 
 */
@RequestMapping("/query")
public void query(HttpServletRequest request,HttpServletResponse response) throws IOException{
    System.out.println("波波烤鴨:query");
    System.out.println(request);
    System.out.println(response);
    response.sendRedirect(request.getContextPath()+"/user/hello.jsp");
}      
SpringMVC教程2[處理及響應請求]

1.5 @RequestMapping的說明

   映射路徑

   是個@RequestMapping最基本的功能,用法:

@RequestMapping("/delete")
 public String delete(){
    System.out.println("波波烤鴨:删除資料操作....");
    return "/hello";
 }      

   窄化請求

   窄化請求用來限定請求路徑,即将@RequestMapping放在類上,這樣,方法的請求路徑是類上的@ReqmestMapping+方法上的@RequestMapping

SpringMVC教程2[處理及響應請求]

   請求方法限定

SpringMVC教程2[處理及響應請求]
SpringMVC教程2[處理及響應請求]

2.參數綁定

SpringMVC教程2[處理及響應請求]

2.1基本資料類型

SpringMVC教程2[處理及響應請求]
/**
 * 接收參數
 *    基本資料類型
 * @param id
 * @param name
 * @return
 */
@RequestMapping("add")
public String add(int id,String name){
    System.out.println(id+"---"+name);
    return "/hello";
}      
SpringMVC教程2[處理及響應請求]
SpringMVC教程2[處理及響應請求]
/**
 * 接收參數
 *    基本資料類型
 *    請求參數如果和形參名稱不一緻可以通過@RequestParam類指定
 * @param id
 * @param name
 * @return
 */
@RequestMapping("add") 
public String add(int id,@RequestParam("username")String name){
    System.out.println(id+"---"+name);
    return "/hello";
}      
SpringMVC教程2[處理及響應請求]
SpringMVC教程2[處理及響應請求]
SpringMVC教程2[處理及響應請求]

此時,如果不想傳遞該參數,需要明确指定,指定方式有兩種:

   通過required屬性指定該參數不是必填的

/**
 * 接收參數
 *    基本資料類型
 *    請求參數如果和形參名稱不一緻可以通過@RequestParam類指定
 * @param id
 * @param name
 * @return
 */
@RequestMapping("add") 
public String add(int id
        ,@RequestParam(value="username",required=false)String name){
    System.out.println(id+"---"+name);
    return "/hello";
}      
SpringMVC教程2[處理及響應請求]

2. 通過defaultValue屬性給該參數指定一個預設值

/**
 * 接收參數
 *    基本資料類型
 *    請求參數如果和形參名稱不一緻可以通過@RequestParam類指定
 * @param id
 * @param name
 * @return
 */
@RequestMapping("add") 
public String add(int id
        ,@RequestParam(value="username",defaultValue="kaoya")String name){
    System.out.println(id+"---"+name);
    return "/hello";
}      
SpringMVC教程2[處理及響應請求]

2.2對象

2.2.1簡單對象

1.建立Book對象

public class Book {

    private int id;
    
    private String name;
    
    private String author;

    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 String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }
    
}      

2.設定形參為Book對象接收資料

@Controller
public class BookController {

    /**
     * 是@RequestMapping(value = "/doReg",method = RequestMethod.POST)的簡寫,
     * 但是@PostMaping隻能出現在方法上,不能出現在類上
     * @param book
     * @return
     */
    //@RequestMapping("/add")
    @PostMapping("/add") 
    public String add(Book book){
        System.out.println(book);
        return "/index.jsp";
    }
}      

3.表單傳遞資料

<form action="/add" method="post">
    <table>
        <tr>
            <td>編号</td>
            <td><input type="text" name="id"></td>
        </tr>
        <tr>
            <td>書名</td>
            <td><input type="text" name="name"></td>
        </tr>
        <tr>
            <td>作者</td>
            <td><input type="text" name="author"></td>
        </tr>
        <tr>
            <td><input type="submit" value="添加"></td>
        </tr>
    </table>
</form>      
SpringMVC教程2[處理及響應請求]
SpringMVC教程2[處理及響應請求]

2.2.2包裝對象

1.book對象包含Author對象

SpringMVC教程2[處理及響應請求]

2.表單送出資料

<form action="add" method="post">
    <table>
        <tr>
            <td>編号</td>
            <td><input type="text" name="id"></td>
        </tr>
        <tr>
            <td>書名</td>
            <td><input type="text" name="name"></td>
        </tr>
        <tr>
            <td>作者年齡</td>
            <td><input type="text" name="author.age"></td>
        </tr>
        <tr>
            <td>作者姓名</td>
            <td><input type="text" name="author.name"></td>
        </tr>
        <tr>
            <td>作者性别</td>
            <td><input type="text" name="author.sex"></td>
        </tr>
        <tr>
            <td><input type="submit" value="添加"></td>
        </tr>
    </table>
</form>      
SpringMVC教程2[處理及響應請求]

3.結果

SpringMVC教程2[處理及響應請求]

2.3數組集合類型

   數組

   表單中直接傳遞多個參數:

<form action="user/doReg" method="post">
    <table>
        <tr>
            <td>使用者名</td>
            <td><input type="text" name="username"></td>
        </tr>
        <tr>
            <td>使用者密碼</td>
            <td><input type="password" name="password"></td>
        </tr>
        <tr>
            <td>興趣愛好</td>
            <td><input type="checkbox" name="favorites" value="zuqiu">足球
                <input type="checkbox" name="favorites" value="lanqiu">籃球 <input
                type="checkbox" name="favorites" value="pingpang">乒乓球</td>
        </tr>
        <tr>
            <td><input type="submit" value="注冊"></td>
        </tr>
    </table>
</form>      
@RequestMapping("/doReg") 
    public String doReg(String username
            ,String password,String[] favorites){
        System.out.println(username+"---"+password);
        for (String f : favorites) {
            System.out.println(f);
        }
        return "/index.jsp";
    }      
SpringMVC教程2[處理及響應請求]
SpringMVC教程2[處理及響應請求]
SpringMVC教程2[處理及響應請求]

2.集合

除了自定義參數類型轉換,如果想要使用集合去接收參數,也可以将集合放到一個包裝類中。

public class User {
    
    private String username;
    private String password;
    private List<String> favorites;

    @Override
    public String toString() {
        return "User{" + "username='" + username + '\'' + ", password='" + password + '\'' + ", favorites=" + favorites
                + '}';
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public List<String> getFavorites() {
        return favorites;
    }

    public void setFavorites(List<String> favorites) {
        this.favorites = favorites;
    }
}
      
SpringMVC教程2[處理及響應請求]
SpringMVC教程2[處理及響應請求]

這樣,集合中也能收到傳遞來的參數。

SpringMVC教程2[處理及響應請求]

2.4Date類型

接收資料類型是Date類型的需要通過轉換器進行接收

@RequestMapping("/update")
    public String update(Date d){
        System.out.println(d);
        return "/index.jsp";
    }      

如果不轉換直接通路送出會爆400錯誤

SpringMVC教程2[處理及響應請求]

建立自定義的轉換器

/**
 * 自定義轉換器
 * 
 * @author dpb【波波烤鴨】
 *
 */
public class DateConvert implements Converter<String,Date>{

    @Override
    public Date convert(String msg) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            return sdf.parse(msg);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

}      

配置轉換器

<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.3.xsd
        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-4.3.xsd">
    
    <!-- 開啟注解 -->
    <mvc:annotation-driven conversion-service="formattingConversionServiceFactoryBean"></mvc:annotation-driven>
    <!-- 開啟掃描 -->
    <context:component-scan base-package="com.dpb.controller"></context:component-scan>
    <!-- 配置視圖解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 配置響應位址的前字尾 
        <property name="prefix" value="/user"/>
        <property name="suffix" value=".jsp"/>-->
    </bean>
    
    <!-- 配置轉換器 -->
    <bean id="formattingConversionServiceFactoryBean" 
    class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.dpb.convert.DateConvert"/>
            </set>
        </property>
    </bean>
</beans>      
SpringMVC教程2[處理及響應請求]
SpringMVC教程2[處理及響應請求]

3.響應資料

3.1ModelAndView

3.2HttpServletRequest

3.3HttpSession

3.4Map

@RequestMapping("/query1")
    public String query1(Map<String,Object> map){
        map.put("msg", "map --> value");
        return "/index.jsp";
    }         
SpringMVC教程2[處理及響應請求]
SpringMVC教程2[處理及響應請求]

3.5Model

@RequestMapping("/query2")
    public String query2(Model model){
        model.addAttribute("msg", "model --> value");
        return "/index.jsp";
    }      
SpringMVC教程2[處理及響應請求]

3.6ModelMap

@RequestMapping("/query3")
    public String query3(ModelMap mm){
        mm.addAttribute("msg", "modelMap --> value");
        return "/index.jsp";
    }      
SpringMVC教程2[處理及響應請求]

注意:@SessionAttributes将資料儲存在session作用域中,上面幾個傳值都是request作用域

SpringMVC教程2[處理及響應請求]
SpringMVC教程2[處理及響應請求]
SpringMVC教程2[處理及響應請求]

4.post方式中文亂碼問題處理

在web.xml檔案中添加如下代碼即可

<!-- spring架構提供的字元集過濾器 -->
    <!-- spring Web MVC架構提供了org.springframework.web.filter.CharacterEncodingFilter用于解決POST方式造成的中文亂碼問題  -->
<filter>
   <filter-name>encodingFilter</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>encodingFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>         

繼續閱讀