servlet的请求转发和重定向
1.请求转发
将该请求交给服务器的另一个服务进行处理,该请求的生命周期没有停止,由request进行控制。
调用方法:
request.getRequestDispacther(“/test.jsp”).forword(request,response);
2.重定向
将该请求重定向到另一个页面(或者另一个客服端),该请求的生命周期停止,由reponse进行控制。
调用方法:
response.sendRedirect(“test.jsp”);
GET VS POST
1、多数浏览器对于POST采用两阶段发送数据的,先发送请求头,再发送请求体,即使参数再少再短,也会被分成两个步骤来发送(相对于GET),也就是第一步发送header数据,第二步再发送body部分。HTTP是应用层的协议,而在传输层有些情况TCP会出现两次连结的过程,HTTP协议本身不保存状态信息,一次请求一次响应。对于TCP而言,通信次数越多反而靠性越低,能在一次连结中传输完需要的消息是最可靠的,尽量使用GET请求来减少网络耗时。如果通信时间增加,这段时间客户端与服务器端一直保持连接状态,在服务器侧负载可能会增加,可靠性会下降。
Tips:关于这点你可以参考:Yahoo网站性能优化指南之服务器篇
http://segmentfault.com/a/1190000000353790
http://developer.yahoo.com/performance/rules.html
http://blogread.cn/it/article/6100?f=wb YSLOW法则中,为什么yahoo推荐用GET代替POST?
上面这篇文章介绍了 wireshark 抓包验证 post 两次发包,get 一次发包的全过程,推荐阅读。
2、GET请求能够被cache,GET请求能够被保存在浏览器的浏览历史里面(密码等重要数据GET提交,别人查看历史记录,就可以直接看到这些私密数据)POST不进行缓存。
3、GET参数是带在URL后面,传统IE中URL的最大可用长度为2048字符,其他浏览器对URL长度限制实现上有所不同。POST请求无长度限制(目前理论上是这样的)。
4、GET提交的数据大小,不同浏览器的限制不同,一般在2k-8K之间,POST提交数据比较大,大小靠服务器的设定值限制,而且某些数据只能用 POST 方法「携带」,比如 file。
5、全部用POST不是十分合理,最好先把请求按功能和场景分下类,对数据请求频繁,数据不敏感且数据量在普通浏览器最小限定的2k范围内,这样的情况使用GET。其他地方使用POST。
6、GET 的本质是「得」,而 POST 的本质是「给」。而且,GET 是「幂等」的,在这一点上,GET 被认为是「安全的」。但实际上 server 端也可以用作资源更新,但是这种用法违反了约定,容易造成 CSRF(跨站请求伪造)。
post方式相比get安全,携带数据更大。GET请求只进行一次提交,速度更快,适合于安全性要求不严的查询请求
JSP中九大内置对象为:
request 请求对象 类型 javax.servlet.ServletRequest 作用域 Request
response 响应对象 类型 javax.servlet.SrvletResponse 作用域 Page
pageContext 页面上下文对象 类型 javax.servlet.jsp.PageContext 作用域 Page
session 会话对象 类型 javax.servlet.http.HttpSession 作用域 Session
application 应用程序对象 类型 javax.servlet.ServletContext 作用域 Application
out 输出对象 类型 javax.servlet.jsp.JspWriter 作用域 Page
config 配置对象 类型 javax.servlet.ServletConfig 作用域 Page
page 页面对象 类型 javax.lang.Object 作用域 Page
exception 例外对象 类型 javax.lang.Throwable 作用域 page
JSP内置对象——application对象
一、application介绍
1、实现了用户间数据的共享,可存放全局变量。(类似静态对象)
2、开始于服务器启动,终止于服务器的关闭(生命周期)
3、在用户的前后连接或不同用户之间的连接中,可以对application对象的同一属性进行操作
4、在任何地方对application对象属性进行操作,都将影响到其他用户对此的访问
5、application对象是ServletContext类的实例
二 通过接口注入内置对象
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.util.ServletContextAware;
import com.opensymphony.xwork2.ActionSupport;
//所有Action动作的父类,并注入内置对象
public class SuperAction implements ServletRequestAware,
ServletResponseAware,ServletContextAware{
/**
*
*/
//请求对象
protected HttpServletRequest request;
//响应对象
protected HttpServletResponse response;
//会话对象
protected HttpSession session;
//全局对象
protected ServletContext application;
public void setServletContext(ServletContext application) {
// TODO Auto-generated method stub
this.application=application;
}
public void setServletResponse(HttpServletResponse response) {
// TODO Auto-generated method stub
this.response=response;
}
public void setServletRequest(HttpServletRequest request) {
// TODO Auto-generated method stub
this.request=request;
this.session=request.getSession();
}
}
子类这样也可以直接引用父类的属性
三 在MVC框架中获取内置对象
- struts2中获取内置对象
Struts2获取request对象
1.通过ActionContext获取返回的是map集合
Map request = (Map)ActionContext.getContext().get(“request”);
request.put(“tasks”, tasks);
2.通过ServletActionContext类来获取
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute(“username”, “zhangsan”);
req.getSession().setAttribute(“b”, “bb”);//获取session对象
request.getSession().getServletContext().getApplication(); //得到Application
3.通过接口注入的方式(推荐使用)
Struts2获取session对象
Map session=ActionContext.getContext().getSession();
//在session中设值
session.put(“username”, username);
2.springMVC中获取内置对象
//获取request对象
1.(推荐使用)
public String reg2(HttpServletRequest req){
req.setAttribute(“a”, “aa”);
}
2.
public String reg(ModelMap map){
map.put(“a”, “aaa”);
return “index”;
}
//获取session对象
1.(推荐使用)
public String reg2(HttpServletRequest req){
req.getSession().setAttribute(“b”, “bb”);
}
2.使用注解
@SessionAttributes({“u”,“a”}) //将ModelMap中属性名字为u、a的再放入session中。这样,request和session中都有了。
参考资料:
1.关于 HTTP GET/POST 请求参数长度最大值的一个理解误区https://blog.csdn.net/a460550542/article/details/72511343