什么是页面特殊参数?
在Leopard中,定义的页面特殊参数就是在controller中只需要写上这个参数的名字,就可以在方法中拿到值 。比如:sessUserId, 就是从session中获取userId的值。
Leopard中定义了很多页面特殊参数,包括:
proxyIp:获取离服务器最近的机器IP
requestUri:当前请求的URI
sessCaptcha:session中的验证码
sessionId:获取sessionId
sessUserId:当前登录的用户ID
sessUsername:当前登录的用户名
userAgent:获取浏览器类型(User-Agent)
这些参数被定义为Leopard页面特殊参数,或者称之为关键字参数。以上页面特殊参数,就像java的关键字一样。在页面传递的时候,如果出现同名的参数,将被忽略页面参数值。举个例子:比如你在页面提交时有一个属性名为sessUserId,被赋值为1,而session中的sessUserId是2,那么在controller中全拿到的值是2,而不是1。1将被忽略,因此在页面传递时,请不要使用以上页面特殊参数。
通过上以上的描述,相信各位同学对页面特殊参数已经有了一定的了解。
对于页面特殊参数,那就是一个字“屌炸天”!对不起,请宽恕我,我是受坐山雕的影响!
在web系统中,难免会将一些会话中常用的值存入Session中,比如说:当前登录用户的机构信息、当前登录用户的角色信息、当前登录用户的用户信息等等。
当需要从Session中获取值时,通常会采取在Controller 的方法入口参数传入HttpServletRequest ,然后再调用request.getSession().getAttribute("xxxx")来获取值。严谨的写法,还需要判断requst.getSession、返回值等是否为空?
例如:在session中获取userId的值,通常的写法如下:
package io.leopard.util;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
public class SessionUtil {
public static String getSessUserId(HttpServletRequest request) {
String sessUserId = "";
HttpSession session = request.getSession();
if (session != null) {
sessUserId = (String) session.getAttribute("sessUserId");
}
return sessUserId;
}
}
那么在Controller里获取sessUserId如下:
package io.leopard.web.mvc.controller;
import io.leopard.util.SessionUtil;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class UserController {
@RequestMapping(value = "/checkMobile.do")
public ModelAndView checkMobile(HttpServletRequest request)
throws IOException {
ModelAndView model = new ModelAndView("/web/user/checkMobile");
String userId = SessionUtil.getSessUserId(request);
return model;
}
}
以上方法,有二点让我难以接受:
1、在checkMobile方法里传入了HttpServletRequest这个参数,因为HttpServletRequest是一个包装对象,编写测试代码时需要参照源码进行参数值设置。
2、每次获取userId都需要写一行代码:SessionUtil.getSessUserId(request);
原始的写法我们已经见识,那么在Leopard中的写法是怎么样的呢?只需要在方法入口中传入sessUserId这个参数即可,代码如下:
package io.leopard.web.mvc.controller;
import java.io.IOException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class UserController {
@RequestMapping(value = "/checkMobile.do")
public ModelAndView checkMobile(String sessUserId) throws IOException {
ModelAndView model = new ModelAndView("/web/user/checkMobile");
return model;
}
}
真是应了那一个字-“屌炸天”,那么sessUserId是怎么获取到对应的值的呢?只需要简单的二步即可以搞定:
1、实现接口PageParameter中的二个方法:getKey(), getValue(HttpServletRequest request);
2、注册实现类为bean,使用注解的形式。对了,别忘记在xml中进行扫描。
上例中sessUserId的实现代码如下:
package io.leopard.web4j.parameter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang.NotImplementedException;
import org.springframework.stereotype.Service;
/**
* 获取当前登录的自定义用户Id
*
* @author 阿海
*
*/
@Service
public class SessUserIdPageParameter implements PageParameter {
@Override
public String getValue(HttpServletRequest request) {
String sessUserId = "";
HttpSession session = request.getSession();
if (session != null) {
sessUserId = (String) session.getAttribute("sessUserId");
}
return sessUserId;
}
@Override
public String getKey() {
return "sessUserId";
}
}
Leopard不建议在session中存入过多的参数,尤其是对象参数。存入过多参数,在开启分布式时,有可能会导致情能问题!