Servlet
- Servlet主要负责接收用户请求HttpServletRequest,在doGet(),doPost()中做相应的处理,并将回应HttpServletResponse反馈给用户。
CGI和Servlet
- 通用网关接口(Common Gateway Interface/CGI)是一种重要的互联网技术,可以让一个客户端,从网页浏览器向服务器上的程序请求数据。
- CGI缺点:
- 每个请求启动一个进程。系统开销大
- 每个请求加载运行一个CGI程序
- 需要重复编写处理网络协议的代码
- Servlet优点:
- 只要启动一个进程,加载一个JVM。系统开销小
- 多个请求做相同处理时,只要加载一个类
- 所有动态加载的类可以实现对网络协议以及请求解码的共享
- 能直接和Web服务器交互,还能在各个程序间共享数据,而普通CGI程序不能
- 注:Fast CGI已经解决了CGI效率上的问题
get和post请求
- get请求是从服务器上获得资源,post是向服务器提交数据
- get表单数据按name=value的形式添加到action指向的URL,两者用”?”连接,变量间用”&”连接;post是将表单数据放在HTTP协议的请求头或消息体中,传递到action指向URL
- get有长度限制(最大2048字符),post没有
- get参数会显示在地址栏,post不会
- get提交表单典型应用是搜索引擎,get方式设计为查询用
转发(Forword)和重定向(Redirect)
转发是服务器行为
1
request.getRequestDispatcher("页面地址(不加虚拟路径)").forword(request,response);
重定向是客户端行为
1
response.sendRedirect("页面地址(加虚拟路径)");
转发地址栏不改变,重定向地址栏改变
- 转发是一次请求,重定向是两次请求
- 转发可共享request域中数据,用于用户登录(传参给登录后页面)。重定向不能共享数据,用于注销登录返回主页和跳转到其他网站
- 转发效率高,重定向相率低
Servlet与线程安全
- Servlet不是线程安全的,多线程并发的读写会导致数据不同步的问题
JSP与Servlet
- JSP本质上是Servlet
- MVC架构模式中,JSP适合充当视图(view)而Servlet适合充当控制器(controller)
request.getAttribute()和 request.getParameter()
- getParameter()是获取 POST/GET 传递的参数值,类型是String,用于客户端重定向时,读取提交表单中的值
- getAttribute()是获取对象容器中的数据值,类型是Object,可用setAttribute设置成任意对象,使用灵活
JSP九大内置对象
- request,response,pageContext,session,application,out,config,page,exception
JSP四种作用域
- page代表与一个页面相关的对象和属性。
- request代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。
- session代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。
- application代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。
Cookie和Session
Cookie 数据保存在客户端(浏览器端);Session 数据保存在服务器端
Cookie 一般用来保存用户信息;Session 的主要作用就是通过服务端记录用户的状态,典型的场景是购物车
Session 比 Cookie 安全性更高