javaweb——Servlet

servlet

1.什么是servlet

处理请求和发送响应的过程是一种叫做Servlet的程序来完成的,并且Servlet是为了解决实现动态页面而衍生的东西

(1) ServletServer Applet),全称Java Servlet。是用Java编写的服务器端程序,其主要功能在于交互式地浏览和
修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个
Servlet接口的类,一般情况下,人们将Servlet理解为后者。
(2) Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下
Servlet只用来扩展基于HTTP协议的Web服务器。
(3) Servlet工作模式:
① 客户端发送请求至服务器
② 服务器启动并调用ServletServlet根据客户端请求生成响应内容并将其传给服务器
③ 服务器将响应返回客户端
 

2.tomcat和servlet的关系

Tomcat 是Web应用服务器,是一个Servlet/JSP容器. Tomcat 作为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户.而Servlet是一种运行在支持Java语言的服务器上的组件. Servlet最常见的用途是扩展Java Web服务器功能,提供非常安全的,可移植的,易于使用的CGI替代品.

 

从http协议中的请求和响应可以得知,浏览器发出的请求是一个请求文本,而浏览器接收到的也应该是一个响应文本。

javaweb——Servlet

①:Tomcat将http请求文本接收并解析,然后封装成HttpServletRequest类型的request对象,所有的HTTP头数据读可以通过request对象调用对应的方法查询到。

②:Tomcat同时会要响应的信息封装为HttpServletResponse类型的response对象,通过设置response属性就可以控制要输出到浏览器的内容,然后将response交给tomcat,tomcat就会将其变成响应文本的格式发送给浏览器

 

3、servlet的运行过程

  • ①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步;
  • ②装载并创建该Servlet的一个实例对象;
  • ③调用Servlet实例对象的init()方法;
  • ④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去;
  • ⑤Web应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。

4.servlet的生命周期

 服务器启动时(web.xml中配置load-on-startup=1,默认为0)或者第一次请求该servlet时,就会初始化一个Servlet对象,也就是会执行初始化方法init(ServletConfig conf)

 该servlet对象去处理所有客户端请求,在service(ServletRequest req,ServletResponse res)方法中执行

 最后服务器关闭时,才会销毁这个servlet对象,执行destroy()方法。

javaweb——Servlet

5.请求

HttpServletRequest表示Http环境中的Servlet请求。它扩展于javax.servlet.ServletRequest接口)
常用方法:
1)String getParameter(String name) 根据表单组件名称获取提交数据,返回值是String
注:服务器在接收数据时使用字符串统一接收
2)String[ ] getParameterValues(String name) 获取表单组件对应多个值时的请求数据
3)void setCharacterEncoding(String charset) 指定每个请求的编码(针对post请求才起作用)
4)RequestDispatcher getRequestDispatcher(String path) --跳转页面
返回一个RequestDispatcher对象,该对象的forward( )方法用于转发请求
5)存值 request.setAttribute("key",value);
6)取值 request.getAttribute("key");//取值后需要向下转型
示例: String a1=(String)request.getAttribute("uname");
补充:getpost的区别
1GET请求,请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接。URL的编码格式采用的
ASCII编码,而不是uniclde,即是说所有的非ASCII字符都要编码之后再传输。
POST请求:POST请求会把请求的数据放置在HTTP请求包的包体中。上面的item=bandsaw就是实际的传输数
据。
因此,GET请求的数据会暴露在地址栏中,而POST请求则不会。
2、传输数据的大小
HTTP规范中,没有对URL的长度和传输的数据大小进行限制。但是在实际开发过程中,对于GET,特定的浏览器
和服务器对URL的长度有限制。因此,在使用GET请求时,传输数据会受到URL长度的限制
对于POST,由于不是URL传值,理论上是不会受限制的,但是实际上各个服务器会规定对POST提交数据大小进行
限制,ApacheIIS都有各自的配置。
3、安全性
POST的安全性比GET的高。这里的安全是指真正的安全,而不同于上面GET提到的安全方法中的安全,上面提到的
安全仅仅是不修改服务器的数据。比如,在进行登录操作,通过GET请求,用户名和密码都会暴露再URL上,因为
登录页面有可能被浏览器缓存以及其他人查看浏览器的历史记录的原因,此时的用户名和密码就很容易被他人拿到
了。除此之外,GET请求提交的数据还可能会造成Cross-site request frogery攻击

6.响应

Service API中,定义了一个HttpServletResponse接口,它继承自ServletResponse接口,专门用来封装HTTP
应消息。 在HttpServletResponse接口中定义了向客户端发送响应状态码,响应消息头,响应消息体的方法。
常用方法:
void addCookie(Cookie var1);//给这个响应添加一个cookie
void sendRedirect(String var1) ;//发送一条响应码,将浏览器跳转到指定的位置
PrintWriter getWriter() 获得字符流,通过字符流的write(String s)方法可以将字符串设置到response 缓冲区中,
随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。
setContentType() 设置响应内容的类型
重定向和转发的对比
重定向:response.sendRedirect()转发:request.getRequestDispatcher("../success.jsp").forward(request,response);
相同点:都用来跳转页面
不同点:
a.重定向时地址栏会改变,request中存储的数据会丢失.转发时地址栏显示的是请求页面的地址,request数据可以保
存。
b.转发属于一次请求一次响应,重定向属于两次请求(地址栏修改了两次)两次响应。
补充:使用out对象往页面中输出jshtml,css
:使用js跳转页面,也会丢失request中的数据

7.会话

request存的值只能在单次请求中保存,保存的数据不能跨页面,当重定向时,request存的值会丢失
session的数据可以在多个页面*享,即使重定向页面,数据不会丢失
session中可以包含nrequest
会话的概念:从打开浏览器到关闭浏览器,期间访问服务器就称为一次会话
常用方法:
void setAttribute(String key,Object value) key/value的形式保存对象值,将数据存储在服务器端
Object getAttribute(String key) 通过key获取对象值
void invalidate() 设置session对象失效
String getId() 获取sessionid,当第一次登录成功后,session会产生一个唯一的id,浏览器之后访问时如果发现id
还是之前id,那么说明 当前访问的属于同一个会话
void setMaxInactiveInterval(int interval) 设定session的非活动时间
示例:
方式1: session.setMaxInactiveInterval(10*60);//设置有效时间为10分钟
方式2:修改web.xml
int getMaxInactiveInterval() 获取session的有效非活动时间(以秒为单位),默认的有效时间:30分钟
void removeAttribute(String key)
session中删除指定名称(key)所对应的对象
out.print("<script type='text/javascript'>alert('登录失败');location='../login.jsp'</script>");
<session-config>
<session-timeout>10</session-timeout>//单位:分钟
</session-config>小结 :session失效的方式
1invalidate() 2removeAttribute("key") 3)直接关闭浏览器。
示例:使用session验证用户是否登录
补充:
自动刷新到某页面:
:head标签中添加该标签,单位: