1.最简单方式:参数
@RequestMapping("/test")
@ResponseBody
public void saveTest(HttpServletRequest req, HttpServletResponse resp){
}
2.加入监听器,然后在代码里面获取
在Spring API中提供了一个非常便捷的工具类RequestContextHolder,能够在Controller中获取request对象和response对象,使用方法如下:
public class TestRequest {
public HttpServletRequest getRequest() {
HttpServletRequest request=((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
HttpServletResponse response=((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();
return request;
}
}
tips:需要注意的是如果直接使用这个工具类,则会抛出一个空指针异常。原因是需要先在web.xml配置RequestContextListener监听器:
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
原理
RequestContextListener实现了 ServletRequestListener ,在其覆盖的requestInitialized(ServletRequestEvent requestEvent)方法中,将request最终设置到了RequestContextHolder中.
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
public class RequestContextListener implements ServletRequestListener {
private static final String REQUEST_ATTRIBUTES_ATTRIBUTE =
RequestContextListener.class.getName() + ".REQUEST_ATTRIBUTES";
public void requestInitialized(ServletRequestEvent requestEvent) {
if (!(requestEvent.getServletRequest() instanceof HttpServletRequest)) {
throw new IllegalArgumentException(
"Request is not an HttpServletRequest: " + requestEvent.getServletRequest());
}
HttpServletRequest request = (HttpServletRequest) requestEvent.getServletRequest();//从事件对象中获取request对象
ServletRequestAttributes attributes = new ServletRequestAttributes(request);//将request设置到servletRequestAttributes中
request.setAttribute(REQUEST_ATTRIBUTES_ATTRIBUTE, attributes);//反过来将servletRequestAttributes设置到request中
LocaleContextHolder.setLocale(request.getLocale());
RequestContextHolder.setRequestAttributes(attributes);//再将servletRequestAttributes设置到requestContextHolder中
}
public void requestDestroyed(ServletRequestEvent arg0) {
// TODO Auto-generated method stub
}
二.获取32的uuid
UUID.randomUUID().toString()是java JDK提供的一个自动生成主键的方法。UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的,是由一个十六位的数字组成,表现出来的形式。每张表都可通过这种方式来生成主键
UUID.randomUUID().toString().trim().replace(“-“, “”)
三.接口java.io.Serializable的用处(实现序列化)
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。
1、java.io.Serializable,表示序列化,是一个空接口,也就是说这个接口没有声明任何的方法,所以实现这个接口的类也就不需要实现任何的方法。
2、序列化 用在将对象编码成字节流(序列化)及从字节流编码重构对象(反序列化)。
序列化 为远程通信提供了标准的wire-level协议。
3、 要使类的实例实现序列化,只要在它的声明中加入implements java.io.Serializable
但是却由一些隐患
1 ) 实现了序列化后,一旦发布,讲削弱改变类实现的灵活性。
2 ) 增加了bug和安全漏洞的的可能性
3 ) 当你的新版本发布时增加了相关的测试上的问题。
这个接口使得所有的实现它的类具有一个特殊的(mixin)类型,从而使JVM知道这个类可以安全地串行化。
4、如果你需要把一个Bean实例通过网络传输或者写到磁盘文件的话,那么实现Serializable接口是最简单的,你可以直接通过ObjectInputStream,ObjectOutputStream进行读入或者写出
5、为了EJB容器可以记录用户生存期期间用户的信息,在EJB中实现Stateful Session Bean时,必须继承Serializable。这样,EJB容器才能在它们不再使用时序列化存储它们的状态信息。