本文将分享Spring:如何将HttpServletRequest注入到请求范围的bean中?的详细内容,并且还将对servlet注入service进行详尽解释,此外,我们还将为大家带来关于Handl
本文将分享Spring:如何将HttpServletRequest注入到请求范围的bean中?的详细内容,并且还将对servlet注入service进行详尽解释,此外,我们还将为大家带来关于Handler.handle (String target, HttpServletRequest request, HttpServletResponse response, boolean [] isHandled) 最后一个为什么是数组?、HttpServletRequest 接口、HttpServletResponse 接口、请求转发与重定向、HttpServletRequest.getRemoteUser()与HttpServletRequest.getUserPrincipal()getName()、HttpServletRequest.getRemoteUser()与HttpServletRequest.getUserPrincipal()。getName()的相关知识,希望对你有所帮助。
本文目录一览:- Spring:如何将HttpServletRequest注入到请求范围的bean中?(servlet注入service)
- Handler.handle (String target, HttpServletRequest request, HttpServletResponse response, boolean [] isHandled) 最后一个为什么是数组?
- HttpServletRequest 接口、HttpServletResponse 接口、请求转发与重定向
- HttpServletRequest.getRemoteUser()与HttpServletRequest.getUserPrincipal()getName()
- HttpServletRequest.getRemoteUser()与HttpServletRequest.getUserPrincipal()。getName()
Spring:如何将HttpServletRequest注入到请求范围的bean中?(servlet注入service)
我正在尝试在Spring中建立一个请求范围的bean。
我已经成功设置好了,所以每个请求创建一次bean。现在,它需要访问HttpServletRequest对象。
由于该bean是每个请求创建一次的,所以我认为容器可以轻松地将请求对象注入到我的bean中。我怎样才能做到这一点 ?
答案1
小编典典可以将请求范围的Bean与请求对象自动连接。
private @Autowired HttpServletRequest request;
答案2
小编典典Spring 通过type 的包装器对象公开当前HttpServletRequest
对象(以及当前HttpSession
对象)。此包装对象绑定到ThreadLocal,可以通过调用方法获得。ServletRequestAttributesstaticRequestContextHolder.currentRequestAttributes()
ServletRequestAttributes
提供getRequest()
获取当前请求,getSession()
获取当前会话的方法以及获取存储在两个范围中的属性的其他方法。以下代码虽然有点难看,但应该可以在应用程序中的任何位置为你提供当前的请求对象:
HttpServletRequest curRequest = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
请注意,该RequestContextHolder.currentRequestAttributes()
方法返回一个接口,并且需要进行类型转换以ServletRequestAttributes
实现该接口。
Handler.handle (String target, HttpServletRequest request, HttpServletResponse response, boolean [] isHandled) 最后一个为什么是数组?
OSC 请你来轰趴啦!1028 苏州源创会,一起寻宝 AI 时代
HttpServletRequest 接口、HttpServletResponse 接口、请求转发与重定向
上篇文章我们讲了 servlet 的基本原理,这章将讲一下剩余的部分。
HttpServletRequest 接口
该接口是 ServletRequest 接口的子接口,封装了 HTTP 请求的相关信息,由 Servlet 容器创建其实现类对象并传入 service (ServletRequest req, ServletResponse res) 方法中。我们请求的详细信息都可以通过 HttpServletRequest 接口的实现类对象获取。这个实现类对象一般都是容器创建的,我们不需要管理。
HttpServletRequest 主要功能
获取请求参数
1)什么是请求参数?
请求参数就是浏览器向服务器提交的数据
2)浏览器向服务器如何发送数据
a)附在 url 后面,如:http://localhost:8989/MyServlet/MyHttpServlet?userId=20
b)通过表单提交
<form action="MyHttpServlet" method="post">
你喜欢的足球队<br /><br />
巴西<input type="checkbox" name="soccerTeam" value="Brazil" />
德国<input type="checkbox" name="soccerTeam" value="German" />
荷兰<input type="checkbox" name="soccerTeam" value="Holland" />
<input type="submit" value="提交" />
</form>
3)使用 HttpServletRequest 对象获取请求参数
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//一个name对应一个值
String userId = request.getParameter("userId");
System.out.println("userId="+userId);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//一个name对应一组值
String[] soccerTeams = request.getParameterValues("soccerTeam");
for(int i = 0; i < soccerTeams.length; i++){
System.out.println("team "+i+"="+soccerTeams[i]);
}
}
在请求域中保存数据
数据保存在请求域中,可以转发到其他 Servlet 或者 jsp 页面,这些 Servlet 或者 jsp 页面就会 从请求中再取出数据
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//将数据保存到request对象的属性域中request.setAttribute("attrName", "attrValueInRequest");
//两个Servlet要想共享request对象中的数据,必须是转发的关系
request.getRequestDispatcher("/ReceiveServlet").forward(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//从request属性域中获取数据
Object attribute = request.getAttribute("attrName");
System.out.println("attrValue="+attribute);
}
HttpServletResponse 接口
HttpServletResponse 是 ServletResponse 接口的子接口,封装了 HTTP 响应的相关信息,由
Servlet 容器创建其实现类对象并传入 service (ServletRequest req, ServletResponse res) 方法中。主要功能:
1)使用 PrintWriter 对象向浏览器输出数据
//通过PrintWriter对象向浏览器端发送响应信息
PrintWriter writer = res.getWriter();
writer.write("Servlet response"); writer.close();
2)实现请求重定向
请求转发与重定向
请求转发和重定向是 web 应用页面跳转的主要手段,应用十分广泛,所以我们一定要搞清楚他们的区别。
请求转发:
1)第一个 Servlet 接收到了浏览器端的请求,进行了一定的处理,然后没有立即对请求进行响应,而是将请求 “交给下一个 Servlet” 继续处理,下一个 Servlet 处理完成之后对浏览器进行了响应。在服务器内部将请求 “交给” 其它组件继续处理就是请求的转发。对浏览器来说,一共只发了一次请求,服务器内部进行的 “转发” 浏览器感觉不到,同时浏览器地址栏中的地址不会变成 “下一个 Servlet” 的虚拟路径。
2)在转发的情况下,两个 Servlet 可以共享 Request 对象中保存的数据
3)转发的情况下,可以访问 WEB-INF 下的资源
4)当需要将后台获取的数据传送到 JSP 上显示的时候,就可以先将数据存放到 Request 对象中,再转发到 JSP 从属性域中获取。此时由于是 “转发”,所以它们二者共享 Request 对象中的数据。
public class ForwardServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("forwardServlet doGet");
//请求的转发
//1.调用HTTPServletRequest 的getRequestDispatcher()方法获取RequestDispatcher对象
//调用getRequestDispatcher()方法时需要传入转发的地址
String path = "testServlet";
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/"+path);
//2.调用调用HTTPServletRequest 的forward(request,response)进行请求的转发
requestDispatcher.forward(request,response);
}
}
请求重定向:
1)第一个 Servlet 接收到了浏览器端的请求,进行了一定的处理,然后给浏览器一个特殊的响应消息,这个特殊的响应消息会通知浏览器去访问另外一个资源,这个动作是服务器和浏览器自动完成的,但是在浏览器地址栏里面能够看到地址的改变,会变成下一个资源的地址。
2)对浏览器来说,一共发送两个请求,所以用户是能够感知到变化的。
3)在重定向的情况下,不能共享 Request 对象中保存的数据。
public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("RedirectServlet doGet");
//执行请求的重定向,直接调用reponse.sendRedirect(path)方法
//path为重定向的地址
String path = "testServlet";
response.sendRedirect(path);
}
}
转发与重定向的区别:
|
转发 |
重定向 |
浏览器地址栏 |
不会变化 |
会变化 |
Request |
同一个请求 |
两次请求 |
API |
Request 对象 |
Response 对象 |
位置 |
服务器内部完成 |
浏览器完成 |
WEB-INF |
可以访问 |
不能访问 |
共享请求域数据 |
可以共享 |
不可以共享 |
目标资源 |
必须是当前 Web 应用中的资源 |
不局限于当前 Web 应用 |
图解转发和重定向
原文出处:https://www.cnblogs.com/java-chen-hao/p/10729903.html
HttpServletRequest.getRemoteUser()与HttpServletRequest.getUserPrincipal()getName()
这两个似乎在做相同的事情。谁能解释两者的主要区别?您何时会使用一个与另一个?
HttpServletRequest.getRemoteUser()
HttpServletRequest.getUserPrincipal()。getName()
HttpServletRequest.getRemoteUser()与HttpServletRequest.getUserPrincipal()。getName()
这两个似乎在做相同的事情。谁能解释两者的主要区别?您何时会使用一个与另一个?
HttpServletRequest.getRemoteUser()
HttpServletRequest.getUserPrincipal()。getName()
我们今天的关于Spring:如何将HttpServletRequest注入到请求范围的bean中?和servlet注入service的分享已经告一段落,感谢您的关注,如果您想了解更多关于Handler.handle (String target, HttpServletRequest request, HttpServletResponse response, boolean [] isHandled) 最后一个为什么是数组?、HttpServletRequest 接口、HttpServletResponse 接口、请求转发与重定向、HttpServletRequest.getRemoteUser()与HttpServletRequest.getUserPrincipal()getName()、HttpServletRequest.getRemoteUser()与HttpServletRequest.getUserPrincipal()。getName()的相关信息,请在本站查询。
本文标签: