java 里怎么创建httpservletrequest对象
java-springmvc4-几种获取 HttpServletRequest 对象的方式
以下的 request 实例都编号了,一共 4 种 方式
1、@Autowired 方式。
2、public void Test(HttpServletRequest request1, HttpServletResponse resp,HttpSession session1) 方式。
3、((ServletRequestAttributes)RequestContextHoldergetRequestAttributes())getRequest(); 方式。
4、GlobalgetHttpServletRequest(); 方式,该方式基于 第三种做的封装。
方法4 最灵活,不需要每个 action 中都定义 HttpServletRequest 参数。
javanet;
public class HttpDemo{
public static void main(String[] args)throws Exception{
URL url = new URL('地址');
HttpURLConnection http = (HttpURLConnection)urlopenConnection();
//获取网页的源码
BufferedReader br = new BufferedReader(new InputStreamReader(httpgetInputStream()));
String line = "";
while((line=brreadLine())!=null){
Systemoutprintln(line);
}
brclose();
//获取参数:
String value = getRequestProperty(String key);
}
}
构造HTTP请求头?不是很懂楼主的意思。是想实现浏览器和服务器的通信么?B/S模式,是一种请求/响应交互模式。请求也就是楼主所说的HTTP请求头。通过JAVA网络编程中的SCOKET机制可以加以实现。不过就JAVA而言,其长处在这方面不行。毕竟是高级语言,在运行速度上无法与C/C++等较底层的高级语言相比的。
随着互联网的不断发展,用户在访问互联网的时候使用的终端设备类型也在不断的变化,但是这些都是基于http协议来实现的,下面我们就简单分析一下,http发送请求的处理过程。
HTTP协议是基于TCP协议的,所以它使用面向连接的方式发送请求,通过stream二进制流的方式传给对方。
当然,到了TCP层,它会把二进制流变成一个的报文段发送给服务器。
在发送给每个报文段的时候,都需要对方有一个回应ACK,来保证报文可靠地到达了对方。
如果没有回应,那么TCP这一层会进行重新传输,直到可以到达。
同一个包有可能被传了好多次,但是HTTP这一层不需要知道这一点,因为是TCP这一层在埋头苦干。
TCP层发送每一个报文的时候,都需要加上自己的地址(即源地址)和它想要去的地方(即目标地址),将这两个信息放到IP头里面,交给IP层进行传输。
IP层需要查看目标地址和自己是否是在同一个局域网。
如果是,就发送ARP协议来请求这个目标地址对应的MAC地址,然后将源MAC和目标MAC放入MAC头,发送出去即可。
如果不在同一个局域网,就需要发送到网关,还要需要发送ARP协议,来获取网关的MAC地址,然后将源MAC和网关MAC放入MAC头,发送出去。
网关收到包发现MAC符合,取出目标IP地址,根据路由协议找到下一跳的路由器,获取下一跳路由器的MAC地址,将包发给下一跳路由器。
这样路由器一跳一跳终于到达目标的局域网。
这个时候,后一跳的路由器能够发现,目标地址就在自己的某一个出口的局域网上。
于是,在这个局域网上发送ARP,获得这个目标地址的MAC地址,将包发出去。
目标的机器发现MAC地址符合,就将包收起来;发现IP地址符合,根据IP头中协议项,知道自己上一层是TCP协议,于是解析TCP的头,里面有序列号,IT培训http://wwwkmbdqncn/建议需要看一看这个序列包是不是我要的,如果是就放入缓存中然后返回一个ACK,如果不是就丢弃。
TCP头里面还有端口号,HTTP的服务器正在监听这个端口号。
于是,目标机器自然知道是HTTP服务器这个进程想要这个包,于是将包发给HTTP服务器。
HTTP服务器的进程看到,原来这个请求是要访问一个网页,于是就把这个网页发给客户端。
咱的理解:
当应用程序读取完响应体内容后或者调用 close() 关闭了URLConnectiongetInputStream()返回的流,
JDK中的HTTP协议句柄将关闭连接,并将连接放到连接缓存中。下次获取URLConnection示例,并获取InputStream流时,会再次使用之前打开的TCP连接。
也就是说:
public static String sendPost(String url, String param) { String result = ""; try { URL httpurl = new URL(url); HttpURLConnection httpConn = (HttpURLConnection) httpurlopenConnection(); httpConnsetDoOutput(true); httpConnsetDoInput(true); PrintWriter out = new PrintWriter(httpConngetOutputStream()); outprint(param); outflush(); outclose(); BufferedReader in = new BufferedReader(new InputStreamReader(httpConngetInputStream())); String line; while ((line = inreadLine()) != null) { result += line; } inclose(); } catch (Exception e) { Systemoutprintln("没有结果!" + e); } return result; }
咱在间隔较短的时间内调用上面的方法(连接的地址不一样,但还是同一个服务器同一个项目),用的是同一个TCP连接。咱这么理解对吗?不对的话请具体讲讲。谢谢。
0条评论