关于controller中getPara(String str)和getPara(int index)方法的疑惑

小屌丝公务员,用从1.9开始使用,用jfinal做过几个小项目,很感谢作者。最近在给单位弄一个在线文档管理系统,在使用restful风格时,中文传参后台取值问题,具体代码如下:

$('#commsearch').on('click',function(event){
    //解决url传参中文乱码
    window.location = url + '/' + encodeURI($('#str').val(),"UTF-8") + '-' + $('input:radio[name="pid"]:checked').val(); 
    //window.location = url + '?str=' + $('#str').val() + '&pid=' + $('input:radio[name="pid"]:checked').val(); 
});

这是前台js按钮监听,然后#str的val是中文,使用传统的?name1=value2&name2=value2后台通过getPara("name1")中文正常,定位到core.Controller中知此方法是直接调用request.getParameter("name1");使用v0-v1-v2 这种restful风格后台getPara(0)..这样取值则中文直接后台syso出来的是utf-8编码,系统编码utf-8,自带jetty和tomcat配置 URIEndcoding="utf-8",情况一样,查看getPara(int index)方法知道是从urlParaArrary中获取值,我也不知道这里有没有做转码处理,即URLDecoder.decode(urlParaArrary[i],"UTF-8");

JFinal action report -------- 2017-11-18 21:52:48 ------------------------------
Url         : GET /ft/activity/all/%E8%A5%BF-0
Controller  : gov.xichangxiang.www.controller.ActivityController.(ActivityController.java:1)
Method      : all
UrlPara     : %E8%A5%BF-0
Interceptor : gov.xichangxiang.www.interceptor.FtInterceptor.(FtInterceptor.java:1)

这是v0-v1传参get方式提交,后台getPara(0)出来直接是utf-8,还需要手动转换一遍.

JFinal action report -------- 2017-11-18 21:55:59 ------------------------------
Url         : GET /ft/activity/all
Controller  : gov.xichangxiang.www.controller.ActivityController.(ActivityController.java:1)
Method      : all
Interceptor : gov.xichangxiang.www.interceptor.FtInterceptor.(FtInterceptor.java:1)
Parameter   : str=西  pid=0  
--------------------------------------------------------------------------------

这是传统?name1=value2&name2=value2传参get方式提交,后台getPara("name1")获取正常,然后我就加了两个方法:

/**
	 * Get para from url. The index of first url para is 0.
	 */
	public String getParaWithUTF8(int index) {
		if (index < 0)
			return getPara();
		
		if (urlParaArray == null) {
			if (urlPara == null || "".equals(urlPara))	// urlPara maybe is "" see ActionMapping.getAction(String)
				urlParaArray = NULL_URL_PARA_ARRAY;
			else
				urlParaArray = urlPara.split(URL_PARA_SEPARATOR);
			
			for (int i=0; i<urlParaArray.length; i++)
				if ("".equals(urlParaArray[i]))
					urlParaArray[i] = null;
		}
		return urlParaArray.length > index ? URLDecoder.decode(urlParaArray[index],"UTF-8"): null;
	}
	/**
	 * Get para from url. The index of first url para is 0.
	 */
	public String getParaWithDecoder(int index, String code) {
		if (index < 0)
			return getPara();
		
		if (urlParaArray == null) {
			if (urlPara == null || "".equals(urlPara))	// urlPara maybe is "" see ActionMapping.getAction(String)
				urlParaArray = NULL_URL_PARA_ARRAY;
			else
				urlParaArray = urlPara.split(URL_PARA_SEPARATOR);
			
			for (int i=0; i<urlParaArray.length; i++)
				if ("".equals(urlParaArray[i]))
					urlParaArray[i] = null;
		}
		return urlParaArray.length > index ? URLDecoder.decode(urlParaArray[index],code): null;
	}

恳请大神@詹波帮我编译下,得到Controller.class我的邮箱zuixin02170321@qq.com

评论区

Ghai、海

2017-11-20 10:18

BaseController extends Controller.....

杜福忠

2017-11-21 09:03

话说不是有源码么...
https://gitee.com/jfinal/jfinal
不过使用开源项目最好不要改源码, 最好是采用Base层来搞

热门反馈

扫码入社