考考你的頁面跳轉

             這幾天項目中遇到了一個頁面跳轉問題,這又是由傳值問題引起的……好吧,先介紹背景(>﹏<)。

     要實現這樣一個功能:我要最終跳到一個綜合查詢頁面,有以下四種途徑:在首頁上方的搜索框輸入姓名,跳入該頁面並查出這個人的相關信息;在首頁導航欄點擊一級/二級領域跳入該頁面並查詢出該領域內人員的相關信息;直接點擊頁面鏈接,跳入該查詢頁。

     顯而易見,最後一種途徑最簡單,也不是今天的談資~

     通過一級/二級領域查詢,需要帶領域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,不行了自己動手實驗,這樣會效率更高。



     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章