JavaWeb-Servlet

Servlet(Servlet Applet),全程Java Servlet。是java编写的服务器端程序,主要功能是在交互式地浏览和修改数据,生成动态web内容。
工作模式:

  1. 客户端发送至服务器。
  2. 服务器启动并调用Servlet,Servlet根据用户客户端生成响应内容并传给服务器。
  3. 服务器响应返回客户端。

弊端:为了能够输出HTML格式内容,需要编写大量重复代码,造成不必要的重复劳动。为了解决这个问题,基于Servlet技术产生了JavaServet Pages技术,也就是JSP。Servlet和JSP两者分工协作,Servlet侧重于解决运算和业务逻辑问题,JSP则侧重于解决展示问题

CGI与Servlet

CGI(Common Gateway Interface),通用网关接口,根据请求信息动态生成内容回应的技术。他的原理是当收到访问一个访问请求,则去调用一个外部程序来接受这个请求,并对这个请求进行处理,将结果返还给客户端,这就意味着每当收到一个请求都要去开启外部程序,在高并发的场景下,这会导致服务器无法处理过多的请求,所以渐渐被淘汰

配置映射关系

<servlet>
<servlet-name>自定义名称</servlet-name>
<servlet-class>处理请求的类的完整路径</servlet-class>
</servlet>
<servlet-mapping><!-- mapping 表示映射 -->
<servlet-name>自定义名称</servlet-name>
<url-pattern>请求名</url-pattern>
</servlet-mapping>

自定义名称须一致。
当用户访问网页,向服务器发送请求。服务器在web的xml配置文件中找到servlet映射中url-parttern与html标签内容一致的servlet-name。并在servlet中对前面的servlet-name进行匹配。后执行对应servlet-class中的处理类

Servlet 生命周期

当客户端发送第一次请求后,由web服务器去解析请求,根据请求找到对应的servlet,判断该类是否存在,如果不存在则创建servlet实例,调用其init()方法进行初始化,初始化完成后调用service()方法,由service()判断客户端的请求方式,如果是get,则执行doGet()方法,如果是post,则执行doPost()方法。处理完成后将结果返还给客户端,单次请求处理完毕。
当客户端发送第二次请求后,由web服务器去解析请求,根据请求找到对应的servlet,判断该对象是否存在,如果存在则直接调用service()方法,再调用doGet()或doPost()方法。
当服务器关闭时调用destroy()方法。

Servlet的生命周期分为5个阶段:加载、创建、初始化、处理客户请求、卸载。
(1)加载:容器通过类加载器使用servlet类对应的文件加载servlet
(2)创建:通过调用servlet构造函数创建一个servlet对象
(3)初始化:调用init方法初始化
(4)处理客户请求:每当有一个客户请求,容器会创建一个线程来处理客户请求
(5)卸载:调用destroy方法让servlet自己释放其占用的资源

请求(HttpServletRequest)

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( )方法用于转发请求
    示例如下:
req.getRequestDispatcher().forward(req.resp);

get和post区别

  1. get请求会将参数拼接到url之后,并以?分割URL和传输数据,多个参数用&连接。
    Post 请求会将请求数据放置在HTTP请求包的包体中。上面的item=bandsaw是实际传输的数据。所以GET请求的数据会暴露在地址栏中,不安全。
  2. 传输数据大小
    get请求对URL的长度和传输数据的大小进行了限制。
    而Post由于不是URL传值,理论上是不会受到限制。
  3. Post具有更高的安全性。除了get请求会暴露参数在URL上以外,还容易受到跨站点请求伪造攻击。

sendRedirect(String var1);//发送响应码,将浏览器跳转到指定位置

响应(HttpServletResponse)

  1. void sendRedirect(String var1) ;//发送响应,将浏览器跳转到指定的位置
  2. PrintWriter getWriter() 获得字符流,通过字符流的write(String s)方法可以将字符串设置到response 缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。
  3. setContentType() 设置响应内容的类型
    事例:
resp.setContentType("text/html;charset=utf-8");//设置流的编码
PrintWriter writer = resp.getWriter();
writer.print(<script>alert("请使用post请求")</script);

重定向和转发的对比

重定向:response.sendRedirect()

转发:request.getRequestDispatcher("…/success.jsp").forward(request,response);

相同点:都用来跳转页面

不同点:

  1. 重定向时地址栏会改变,request中存储的数据会丢失.转发时地址栏显示的是请求页面的地址,request数据可以保
    存。
  2. 转发属于一次请求一次响应,重定向属于两次请求(地址栏修改了两次)两次响应。
    补充:使用out对象往页面中输出js或html,css.

会话

request存储的值只能在单词请求中保存,保存的数据不能跨页面,当重定向时,request的存的值会丢失。
Session的数据可以在多个页面中共享,即使重定向页面,数据不会丢失。
session中可以包含多个request。
从打开浏览器到关闭浏览器,期间访问服务器称为一次会话。
常用方法如下:

  1. void setAttribute(String key,Object value) 以key/value的形式保存对象值,将数据存储在服务器端
  2. Object getAttribute(String key) 通过key获取对象值
  3. void invalidate() 设置session对象失效
  4. String **getId() **获取sessionid,当第一次登录成功后,session会产生一个唯一的id,浏览器之后访问时如果发现id值
    还是之前id,那么说明 当前访问的属于同一个会话
  5. **getMaxInactiveInterval()**获取session的非活动时间
  6. void setMaxInactiveInterval(int interval) 设定session的非活动时间
    方式1: session**.setMaxInactiveInterval(10*60)**;//设置有效时间为10分钟
    方式2:修改web.xml
<session-config>
<session-timeout>10</session-timeout>//单位:分钟
</session-config>

获得初始化参数

局部初始化参数

  1. 在web.xml中定义初始化参数
<servlet>
	<servlet-name></servlet-name>
	<servlet-class></servlet-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>utf-8</param-value>
	</init-param>
</servlet>
  1. 在servlet中获取参数,通过重写int()有参方法

  2. 为了使初始化的变量可以在service中被调用,将变量提到全局变量。

String encoding = null;
public void init(ServletConfig config) throws ServletException {
   encoding= config.getInitParameter("encoding");
}

全局初始化参数

  1. 定义,context-param是和servlet标签同级别
<context-param>
	<param-name>globalEncoding</param-name>
	<param-value>utf-8</param-value>
</context-param>
  1. 获得数据
@Override // 请求->init()->service()->doget/dopost->destory();
public void init(ServletConfig config) throws ServletException {
	globalEncoding=config.getServletContext().getInitParameter("bianma");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值