1. 程式人生 > 其它 >SpringMVC框架(3)

SpringMVC框架(3)

結果跳轉方式

ModelAndView

設定ModelAndView物件,根據view的名稱,和檢視解析器跳到指定的頁面

頁面:{檢視解析器字首} +viewName + {檢視解析器字尾}

<!-- 檢視解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
      id="internalResourceViewResolver">
    <!-- 字首 -->
    <property name="prefix" value
="/WEB-INF/jsp/" /> <!-- 字尾 --> <property name="suffix" value=".jsp" /> </bean>

對應的Controller類

public class ControllerTest1 implements Controller {
 
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        
//返回一個模型檢視物件 ModelAndView mv = new ModelAndView(); mv.addObject("msg","ControllerTest1"); mv.setViewName("test"); return mv; } }

ServletAPI

通過設定ServletAPI,不需要檢視解析器

1.通過HttpServletReponse進行輸出

2.通過HttpServletReponse進行重定向

3.通過HttpServletReponse實現轉發

@Controller
public
class ResultGo { @RequestMapping("/result/t1") public void test1(HttpServletRequest req, HttpServletResponse rsp) throws IOException { rsp.getWriter().println("Hello,Spring BY servlet API"); } @RequestMapping("/result/t2") public void test2(HttpServletRequest req, HttpServletResponse rsp) throws IOException { rsp.sendRedirect("/index.jsp"); } @RequestMapping("/result/t3") public void test3(HttpServletRequest req, HttpServletResponse rsp) throws Exception { //轉發 req.setAttribute("msg","/result/t3"); req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,rsp); } }

SpringMVC

通過SpringMVC來實現轉發和重定向的話,不需要檢視解析器

在跳轉的額路徑字串中可以加forward:或redirect:跳轉就不經過檢視解析器

請求轉發跳轉和重定向跳轉,一共有四種情況

1.控制器 請求轉發 跳轉到檢視層

經過檢視解析器:寫跳轉地址的字串

不經過試圖解析器:forward:的跳轉地址

2.控制器 重定向 跳轉到檢視層

redircet:跳轉的檢視地址

3.控制器 請求轉發 跳轉到檢視層

不能經過檢視解析器,forward:跳轉的控制器的地址

4.控制器 重定向 跳轉到控制器

redirect:跳轉的控制器的地址

@RequestMapping("/test9")
public String test9(){
//跳轉到index.jsp 請求轉發方式 //return "forward:/index.jsp"; //跳轉到index.jsp 重定向方式 //return "redirect:/index.jsp"; //跳轉到 test1 請求轉發方式 //return "forward:/demo/test1"; //跳轉到 test1 重定向方式 return "redirect:/demo/test1";
}

資料處理

1.提交的域名稱和處理方法的引數名一致

提交資料:http://localhost:8080/hello?name=LXX

處理方法:

@RequestMapping("/hello")

public String hello(String name){

Stsyem.out.println(name);

return "hello";


}

2.提交的域名稱和處理方法的引數名不一致

提交資料:http://loaclhost:8080/hello?username=LXX

處理方法:

@RequestMapping("/hello")

public String hello(@RequestParam("username") String name){

System.out.println(name);

return  "hello";

}

3.提交的是一個物件

要求提交的表單域和物件的屬性名一致,引數使用物件就行

@RequestMapping("/user")

public String user(User user){

System.out.println(user);

return  "hello";


}

如果使用物件的話,前端傳遞的引數名和物件名必須保持一致,否則就是NULL

資料顯示到前端

第一種:通過ModelAndView

public class ControllerTest1 implements Controller {
 
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        //返回一個模型檢視物件
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","ControllerTest1");
        mv.setViewName("test");
        return mv;
    }
}

第二種:通過ModelMap

@RequestMapping("/hello")
public String hello(@RequestParam("username") String name, ModelMap model){
    //封裝要顯示到檢視中的資料
    //相當於req.setAttribute("name",name);
    model.addAttribute("name",name);
    System.out.println(name);
    return "hello";
}

第三種:通過Model

@RequestMapping("/ct2/hello")
public String hello(@RequestParam("username") String name, Model model){
    //封裝要顯示到檢視中的資料
    //相當於req.setAttribute("name",name);
    model.addAttribute("msg",name);
    System.out.println(name);
    return "test";
}

對比:

Model 只有需要用幾個方法只適用於儲存資料

ModelMap繼承了LinkedMap

ModelAndView 在儲存資料的時候,可以進行設定返回的檢視,進行控制展示層的跳轉

亂碼問題

測試步驟:

1、我們可以在首頁編寫一個提交的表單

<form action="/e/t" method="post">
<input type="text" name="name">
<input type="submit">
</form>


2、後臺編寫對應的處理類

@Controller
public class Encoding {
@RequestMapping("/e/t")
public String test(Model model,String name){
model.addAttribute("msg",name); //獲取表單提交的值
return "test"; //跳轉到test頁面顯示輸入的值
}
}


3、輸入中文測試,發現亂碼

不得不說,亂碼問題是在我們開發中十分常見的問題,也是讓我們程式猿比較頭大的問題!

以前亂碼問題通過過濾器解決 , 而SpringMVC給我們提供了一個過濾器 , 可以在web.xml中配置 .

修改了xml檔案需要重啟伺服器!

<filter>
<filter-name>encoding</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>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


但是我們發現 , 有些極端情況下.這個過濾器對get的支援不好 .

處理方法 :

1、修改tomcat配置檔案 :設定編碼!

<Connector URIEncoding="utf-8" port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
2、自定義過濾器

package com.kuang.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;

/**
* 解決get和post請求 全部亂碼的過濾器
*/
public class GenericEncodingFilter implements Filter {

@Override
public void destroy() {
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//處理response的字元編碼
HttpServletResponse myResponse=(HttpServletResponse) response;
myResponse.setContentType("text/html;charset=UTF-8");

// 轉型為與協議相關物件
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
// 對request包裝增強
HttpServletRequest myrequest = new MyRequest(httpServletRequest);
chain.doFilter(myrequest, response);
}

@Override
public void init(FilterConfig filterConfig) throws ServletException {
}

}

//自定義request物件,HttpServletRequest的包裝類
class MyRequest extends HttpServletRequestWrapper {

private HttpServletRequest request;
//是否編碼的標記
private boolean hasEncode;
//定義一個可以傳入HttpServletRequest物件的建構函式,以便對其進行裝飾
public MyRequest(HttpServletRequest request) {
super(request);// super必須寫
this.request = request;
}

// 對需要增強方法 進行覆蓋
@Override
public Map getParameterMap() {
// 先獲得請求方式
String method = request.getMethod();
if (method.equalsIgnoreCase("post")) {
// post請求
try {
// 處理post亂碼
request.setCharacterEncoding("utf-8");
return request.getParameterMap();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} else if (method.equalsIgnoreCase("get")) {
// get請求
Map<String, String[]> parameterMap = request.getParameterMap();
if (!hasEncode) { // 確保get手動編碼邏輯只執行一次
for (String parameterName : parameterMap.keySet()) {
String[] values = parameterMap.get(parameterName);
if (values != null) {
for (int i = 0; i < values.length; i++) {
try {
// 處理get亂碼
values[i] = new String(values[i]
.getBytes("ISO-8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
}
hasEncode = true;
}
return parameterMap;
}
return super.getParameterMap();
}

//取一個值
@Override
public String getParameter(String name) {
Map<String, String[]> parameterMap = getParameterMap();
String[] values = parameterMap.get(name);
if (values == null) {
return null;
}
return values[0]; // 取回引數的第一個值
}

//取所有值
@Override
public String[] getParameterValues(String name) {
Map<String, String[]> parameterMap = getParameterMap();
String[] values = parameterMap.get(name);
return values;
}
}


這個也是我在網上找的一些大神寫的,一般情況下,SpringMVC預設的亂碼處理就已經能夠很好的解決了!