Spring MVC(十二)--使用ModelView實現重定向


上一篇總結了使用返回字符串的方式實現重定向以及重定向過程中傳遞字符串參數和pojo參數的過程,本篇總結另一種重定向的實現方式--返回ModelAndView

這次的場景是這樣的:在頁面輸入一些信息添加到數據庫,當添加成功時跳轉到列表頁,獲取數據庫中所有記錄,添加失敗時返回到錯誤頁面,獲取添加失敗的記錄信息。

1、創建添加頁面

我在這里貼的是表單部分的代碼:

<!--pojo參數傳遞  -->
        <div class="pojo public">
            <p style="text-align: center;">視圖重定向</p>
            <form id="pojoForm" action="<%=basePath%>param/addParam"
                method="post">
                <table>
                    <tr>
                        <td>名稱:</td>
                        <td><input type="text" name="paramName" value=""></td>
                    </tr>
                    <tr>
                        <td>描述:</td>
                        <td><input type="text" name="paramDesc" value=""></td>
                    </tr>
                    <tr>
                        <td>時間:</td>
                        <td><input type="text" name="pramTime" value=""></td>
                    </tr>
                    <tr>
                        <td></td>
                        <td style="text-align: right;"><input type="submit"
                            value="添加" id="redirectByModelView"></td>
                    </tr>
                </table>
            </form>
        </div>

 

頁面效果圖如下:

是我用紅色框框圈起來的那部分,其他的是其他功能部分的。上面代碼中直接將表單提交到了<%=basePath%>param/addParam中,所以下一步就是完成控制器部分。

2、實現控制器

@Controller
@RequestMapping("/param")
public class ParamController {

    @Autowired
    @Qualifier("paramService")
    ParamService paramService = null;

    @RequestMapping("indexParam")
    public ModelAndView indexParam(String paramId) {
        ModelAndView mv = new ModelAndView();
        System.out.println("paramId:" + paramId);
        List<Param> paramList = paramService.getAllParams();
        mv.addObject(paramList);
        mv.setViewName("param/indexParam");
        return mv;
    }

    /**
     * 重定向到失敗頁面
     * 
     * @param param 重定向目標方法接受pojo參數
     * @return
     */
    @RequestMapping("error")
    public ModelAndView error(Param param) {
        ModelAndView mv = new ModelAndView();
        System.out.println("paramId:" + param.getParamId());
        mv.addObject(param);
        mv.setViewName("param/error");
        return mv;
    }

    /**
     * 通過頁面添加一個參數
     * 
     * @param mv 通過ModelAndView實現重定向
     * @param ra 添加失敗時通過RedirectAttributes類,向重定向的目標傳遞pojo參數
     * @param param 接受pojo參數
     * @return
     */
    @RequestMapping(value = "addParam", method = RequestMethod.POST)
    public ModelAndView addParam(ModelAndView mv, RedirectAttributes ra, Param param) {
        boolean res = paramService.insertParam(param);
        if (res) {
            // 數據庫插入數據時,已經設置了逐漸自動增長,所以此處能獲取到主鍵的前提是設置主鍵回填
   // 添加成功時通過ModelAndView傳遞字符串參數
mv.addObject("paramId", param.getParamId()); mv.setViewName("redirect:./indexParam"); } else {
   //添加失敗時通過RedirectAttributes傳遞pojo參數 ra.addFlashAttribute(
"param", param); mv.setViewName("redirect:./error"); } return mv; } }

上面代碼中的重點有:

  • 表單提交到addParam方法中,接受參數的方式是pojo方式,所以需要注意pojo參數傳遞的幾個事項,前面已經介紹過;
  • 在addParam這個方法中完成重定向邏輯,且重定向是通過返回ModelAndView實現的:如果添加成功,則直接重定向到indexParam方法中,並且通過ModelAndView傳遞字符串參數;如果添加失敗,則重定向到失敗頁面,且將接受的pojo對象當作參數傳遞給重定向之后的方法;
  • 在添加成功后傳遞的參數是param對象的ID,因為數據庫設置的是自動增長,所以前端傳過來的pojo對象中沒有ID,但是此時能夠獲取到,為什么呢?這就要在 MyBatis的映射器配置文件中設置主鍵自動回填,后面代碼中會介紹;
  • 不管重定向傳遞的是字符串還是pojo對象,在重定向后的方法中接受這個參數時,參數名稱都是傳遞時設置的key;

因為調用了service層,所以還需要寫service層的代碼。

3、創建service層

因為上面代碼中,除了添加操作外,還有添加成功之后顯示所有列表的重定向頁面,所以接口需定義兩個方法,一個插入數據,一個獲取所有數據;

1⃣️創建接口

public interface ParamService {

    /**
     * 獲取所有的參數列表
     * 
     * @return
     */
    public List<Param> getAllParams();

    /*
     * 插入一條數據
     */
    public boolean insertParam(Param param);
}

2⃣️創建接口實現類

@Service("paramService")
public class ParamServiceImpl implements ParamService {

    @Autowired
    ParamMapper paramMapper = null;


    @Override
    public List<Param> getAllParams() {
        return paramMapper.getAllParams();
    }

    @Override
    public boolean insertParam(Param param) {
        int res = paramMapper.insertParam(param);
        return res > 0 ? true : false;
    }

}

實現類中主要是調用了DAO層的方法,所以接下來實現DAO層,在MyBatis中就是映射器。

4、DAO層

1⃣️映射器接口

@Repository
public interface ParamMapper {

    /**
     * 獲取所有的參數列表
     * 
     * @return
     */
    public List<Param> getAllParams();

    /**
     * 插入
     * @param param
     * @return
     */
    public int insertParam(Param param);
}

2⃣️映射器配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mvc.dao.ParamMapper">
    <resultMap id="BaseResultMap" type="com.mvc.pojo.Param">
        <id column="param_id" jdbcType="INTEGER" property="paramId" />
        <result column="param_name" jdbcType="VARCHAR" property="paramName" />
        <result column="param_desc" jdbcType="VARCHAR" property="paramDesc" />
        <result column="pram_time" jdbcType="VARCHAR" property="pramTime" />
    </resultMap>

    <select id="getAllParams" resultMap="BaseResultMap">
        SELECT * FROM param
    </select>
    
//需要配置主鍵回填:useGeneratedKeys="true" keyProperty="paramId"
   <insert id="insertParam" parameterType="com.mvc.pojo.Param" useGeneratedKeys="true" keyProperty="paramId"> 
    INSERT INTO param(param_name,param_desc,pram_time) values(#{paramName,jdbcType=VARCHAR},#{paramDesc,jdbcType=VARCHAR},#{pramTime,jdbcType=VARCHAR})
   </insert>
</mapper>

注意⚠️:在插入的SQL中配置了主鍵回填,這樣就可以在插入成功后將主鍵保存在paramId屬性中,並且可以獲取了。

5、重定向成功頁面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<%
    String root = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
            + root + "/";
%>
<script type="text/javascript"
    src="<%=basePath%>jslib/jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="<%=basePath%>jslib/jquery.form.js"></script>
<script type="text/javascript" src="<%=basePath%>js/param.js"></script>
<link href="<%=basePath%>css/param.css" type="text/css" rel="stylesheet">
<title>參數列表</title>
</head>
<body>

    <div>
        <table>
            <thead>
                <tr>
                    <td>參數ID</td>
                    <td>參數名稱</td>
                    <td>參數描述</td>
                    <td>入庫時間</td>
                </tr>
            </thead>
            <tbody>
                <c:forEach var="paramItem" items="${paramList }">
                    <tr>
                        <td>${paramItem.paramId}</td>
                        <td>${paramItem.paramName }</td>
                        <td>${paramItem.paramDesc }</td>
                        <td>${paramItem.pramTime }</td>
                    </tr>
                </c:forEach>
            </tbody>
        </table>
    </div>
</body>
</html>

成功之后的頁面,通過JSTL標簽遍歷並展示獲取到的數據列表,這里有個坑,就是遍歷的時候會給每個元素定義一個名稱var,如果這個值為param,那么獲取它的屬性時就會獲取不到,因為我的pojo類名就是Param,所以我將var的值設置為param時獲取屬性失敗了,這真的很坑!!!

6、重定向失敗頁面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>error</title>
</head>
<body>
    出錯啦!!!!

    <p>${param.paramName}</p>
</body>
</html>

因為之前重定向的時候,如果失敗了傳遞的參數是個pojo對象,所以這里可以獲取對象的屬性;

至此,所有代碼完成,下面進行測試。

7、測試

在頁面輸入以下內容:

點擊添加按鈕后的結果如下:

從上圖中可以看出,成功之后URL變成了重定向路徑,並且參數傳遞成功,而且這個參數是通過設置主鍵回填才能獲取到的;

下面看一下失敗之后的結果,先在頁面輸入以下信息:

重定向結果:

上圖中的失敗,就是傳過來的對象的name屬性值,所以重定向傳遞pojo對象成功!!

8、總結

通過返回ModelAndView對象實現重定向時,需要注意:

傳遞字符串參數時使用ModelAndView即可,傳遞pojo參數時,還是要使用RedirectAttributes的addFlashAttribute方法;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM