這幾天項目中遇到了一個頁面跳轉問題,這又是由傳值問題引起的……好吧,先介紹背景(>﹏<)。
要實現這樣一個功能:我要最終跳到一個綜合查詢頁面,有以下四種途徑:在首頁上方的搜索框輸入姓名,跳入該頁面並查出這個人的相關信息;在首頁導航欄點擊一級/二級領域跳入該頁面並查詢出該領域內人員的相關信息;直接點擊頁面鏈接,跳入該查詢頁。
顯而易見,最後一種途徑最簡單,也不是今天的談資~
通過一級/二級領域查詢,需要帶領域id過去,我通過Restful方式傳過去的,通過a鏈接就搞定了,連路徑帶id,一套帶走~
代碼如下:
<a href="/itoo-jrkj-teacher-web/findTeacherByTwoLevelField/${listFieldVos.firstfieldId}/${listFieldVos.firstfieldId}"><input type="hidden"
id="firstFieldId" value="${listFieldVos.firstfieldId}" />${listFieldVos.fieldName}</a>
可以看到,這兩個id直接從後臺傳過來了,無需其他任何js方法介入。
最後這個搜索框查詢遇到了問題,主要點在參數怎麼帶過去的問題:
開始我是這麼寫的:代碼 V1.0
首頁jsp:
<a href="/itoo-jrkj-teacher-web/findTeacherByNames" class="change" οnclick="saveStrName()"><i class="icon-search"></i></a>
通過Ajax傳參數:<span style="white-space:pre"> </span>function saveStrName() {
var strName = document.getElementById('searchcontent').value;
// 請求參數
$.ajax({
type : 'get',
async:false,
url : '/itoo-jrkj-teacher-web/findTeacherByNames?strName='+strName,//url方式傳參數
data : {
},
success : function() {
}
});
}
Controller接收:<span style="white-space:pre"> </span>/**
* 尋找講師-根據姓名或暱稱--(2016年1月25日14:19:40)
* @throws UnsupportedEncodingException
*/
@RequestMapping(value = "/findTeacherByNames",method=RequestMethod.GET)
public String findTeacherByNames(@RequestParam("strName")String strName,Model model,
HttpServletResponse response,HttpServletRequest request){
model.addAttribute("strName", strName);
// 查詢全部行業
List<Industry> industry = new ArrayList<Industry>();
industry = teacherBean.findAllIndustry(dataBaseName);
model.addAttribute("allIndustry", industry);
String provinceId =findProvinceIdByName();
model.addAttribute("provinceId", provinceId);
return "findLecturer";
}
整體分析:首先,這樣赤裸裸的通過get方法從js向Controller傳中文會亂碼,沒有處理;(注:post不會亂碼)
其次,我預測的執行順序是:先href鏈接,到Controller頁面;然後執行js,也到Controller頁面,這樣路徑和參數一起到,保證了執行順利。但是!!!這一切都建立在美好的預測和想象之中。
實際執行中,Controller會執行兩次,加載完頁面後執行搜索頁window.onload的Ajax方法,這個Ajax中含有再次執行此方法的url,同時,頁面也無法顯示。
修改後 V2.0:
首頁jsp(不變):
<a href="/itoo-jrkj-teacher-web/findTeacherByNames" class="change" οnclick="saveStrName()"><i class="icon-search"></i></a>
通過Ajax傳參數(添加了success裏的頁面跳轉方法,進行了搜索內容編碼):<span style="white-space:pre"> </span>function saveStrName() {
var strName = document.getElementById('searchcontent').value;
var strName1=encodeURI(encodeURI(strName));
// 請求參數
$.ajax({
type : 'get',
async:false,
url : '/itoo-jrkj-teacher-web/findTeacherByNames?strName='+strName,
data : {
},
success : function() {
self.location = '/itoo-jrkj-teacher-web/findTeacherByNames';
}
});
}
Controller接收:/**
<span style="white-space:pre"> </span> * 尋找講師-根據姓名或暱稱--( 2016年1月25日14:19:40)
<span style="white-space:pre"> </span> * @throws UnsupportedEncodingException
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>@RequestMapping(value = "/findTeacherByNames",method=RequestMethod.GET)
<span style="white-space:pre"> </span>public String findTeacherByNames(String strName,Model model,
<span style="white-space:pre"> </span>HttpServletResponse response,HttpServletRequest request){
<span style="white-space:pre"> </span>String strName1=request.getParameter("strName");
<span style="white-space:pre"> </span>try {
<span style="white-space:pre"> </span>strName = URLDecoder.decode(strName1,"utf-8");
<span style="white-space:pre"> </span>} catch (UnsupportedEncodingException e) {
<span style="white-space:pre"> </span>e.printStackTrace();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>HttpSession session = request.getSession();
<span style="white-space:pre"> </span>session.setAttribute("strName", strName);
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>model.addAttribute("strName", strName);
<span style="white-space:pre"> </span>// 查詢全部行業
<span style="white-space:pre"> </span>List<Industry> industry = new ArrayList<Industry>();
<span style="white-space:pre"> </span>industry = teacherBean.findAllIndustry(dataBaseName);
<span style="white-space:pre"> </span>model.addAttribute("allIndustry", industry);
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>String provinceId =findProvinceIdByName();
<span style="white-space:pre"> </span>model.addAttribute("provinceId", provinceId);
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>return "findLecturer";
<span style="white-space:pre"> </span>}
整體分析:這段代碼的Controller會執行三次,並且頁面仍無法顯示。因爲:href到頁面執行一次;Ajax執行success後執行一;條件查詢頁面本身還有一個Ajax,會再次返回到這個Controller(這個沒貼出來,是因爲開始思路有問題,很快刪了這段,就不讓它搗亂了~)。
其實思路問題還是沒解決,到底是不是像想象的那樣,先執行href,再Ajax,然後Ajax的success?是不是頁面跳轉和參數會同時到達Controller?還是怎麼寫都無關緊要,只要它們到了Controller就可以?
修改後3.0
jsp頁面(去掉了href跳轉):
<a href="javascript:;" class="change" οnclick="saveStrName()" ><i class="icon-search"></i></a>
通過Ajax傳參數(傳遞兩次參數): function saveStrName() {
var strName = document.getElementById('searchcontent').value;
var strName1=encodeURI(encodeURI(strName));
// 請求參數
$.ajax({
type : 'get',
async:false,
url : '/itoo-jrkj-teacher-web/findTeacherByNames?strName='+strName1,
data : {
"strName":strName1
},
success : function() {
self.location = '/itoo-jrkj-teacher-web/findTeacherByNames?strName='+strName1;
}
});
}
Controller接收:/**
* 尋找講師-根據姓名或暱稱--(楊建 2016年1月25日14:19:40)
* @throws UnsupportedEncodingException
*/
@RequestMapping(value = "/findTeacherByNames",method=RequestMethod.GET)
public String findTeacherByNames(String strName,Model model,
HttpServletResponse response,HttpServletRequest request){
String strName1=request.getParameter("strName");
try {
strName = URLDecoder.decode(strName1,"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
HttpSession session = request.getSession();
session.setAttribute("strName", strName);
model.addAttribute("strName", strName);
// 查詢全部行業
List<Industry> industry = new ArrayList<Industry>();
industry = teacherBean.findAllIndustry(dataBaseName);
model.addAttribute("allIndustry", industry);
String provinceId =findProvinceIdByName();
model.addAttribute("provinceId", provinceId);
return "findLecturer";
}
這次就成功了,因爲這次通過url和頁面跳轉傳了兩次參數,保證Controller能順利接收到;同時,最主要的是這次做了執行順序測試,怎麼測試的就不詳述了,說一下結果:
在a標籤href和Ajax跳轉同時存在時,先執行Ajax,傳遞url參數;之後success,頁面跳轉,最後執行href。
理清這個思路後,問題也就迎刃而解了。
總結:解決問題的關鍵是分析問題,把問題分析好了再下手就如庖丁解牛,輕而易舉。不要靠亂猜亂撞,遇事先求百度、Google,不行了自己動手實驗,這樣會效率更高。