javaweb 基础 1 servlet 、http请求

Servlet继承关系

MyServlet -> HttpServlet -> GenericServlet -> Servlet

生命周期

init();service();destroy();

init方法只在初始化时调用一次,第一次请求的时候会初始化

service会在有请求时就会调用一次,service内部处理请求方式(GET,POST,PUT.....)

destroy在服务停止时调用

如果继承的servlet不实现相对应的请求方法会默认使用httpservlet中的service方法执行405错误信息

自定义servlet需要在web.xml中配置

<servlet>
    <servlet-name> MyServlet</servlet-name>
    <servlet-class>com.xxx.xxx.MyServlet</servlet-class>
</servlet>

<servlet-mapping>
    //与servlet标签中的servlet-name标签中的值一致
    <servlet-name> MyServlet</servlet-name>
    <url-pattern>请求的地址</url-pattern>
</servlet-mapping>

一个servlet可以对应多个servlet-mapping

servlet默认是在启动服务后进行初始化调用init方法,可以在servlet中配置启动的优先级

<servlet>
    <servlet-name> MyServlet</servlet-name>
    <servlet-class>com.xxx.xxx.MyServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    //与servlet标签中的servlet-name标签中的值一致
    <servlet-name> MyServlet</servlet-name>
    <url-pattern>请求的地址</url-pattern>
</servlet-mapping>

<load-on-startup>1</load-on-startup>标签中的值越小启动的优先级越高,最好不要写负数,可以为0,1,2,3......

servlet在容器中是单例的,是线程不安全的所以尽量不要再servlet中定义成员变量,若非要定义成员变量,那就不要用成员变量的值来处理逻辑代码

http协议

请求

http请求包含三个地方   请求行,请求头,请求体

请求行 最基本的请求信息  

请求地址,请求方式,http协议版本  请求地址

请求头 通过具体的参数来对本次请求进行详细的说明 

以key value形式传递 

 请求体

作为请求的主体发送给服务器

get请求方式 没有请求体,但是有一个queryString来获取请求参数

post请求方式 有请求体 form data

json格式 有请求体

响应

http请包含三个地方   响应行,响应头,响应体

响应行包含三个部分   响应的协议 响应状态 响应码

响应头 包含服务器的信息 

响应体 响应的实际内容  json数据等

会话

http无状态 : 服务端无法区分是同一个客户端还是不同的客户端发送的请求

无状态出现的问题,比如第一次请求为添加商品到购物车 第二次请求为结算商品,如果不区分的话会出现添加商品到购物车添加到其他人的购物车里面,结算会结算其他人的购物车

会话跟踪技术

客户端请求服务端,服务端获取session 如果获取不到就重新生成一个session响应给客户端,客户端下一次或者某次继续发送请求时,携带session服务端再次获取就能分辨出是哪个客户端

常用的api

//获取当前会话,没有则新建
request.getSession();

//获取当前会话,与不带参数的作用相同,没有则新建
request.getSession(true); 

//获取当前会话,有会话则取出 没有则返回null,不会创建新的
request.getSession(false); 

//获取session
HttpSession session = request.getSession();

//获取sessionId
String id = session.getSessionId(); 

//当前session是否是新的 第一次发请求是新的,后面发请求就是假的false
boolean isNew = session.isNew();

//session的非激活间隔时长 默认1800秒 半个小时  session的过期时间 
//如果过期时间内不操作则会失效 重新获取session
int maxInactiveInterval = session.getMaxInactiveInterval();

//设置session的过期时间
session.setMaxInactiveInterval();

//会话强制失效 session强制过期
session.invalidate();

//向session的保存作用域中存数据 key-value形式存储
session.setAttribute();

//向session的保存作用域中取数据 key为保存的key
session.getAttribute(key);

//删除会话
session.removeAttribute(key);

//session的保存作用域是全局的 但是会区别出来,通过sessionid来区别保存的key-value数据
//session的保存作用域是和session保存在一起的

服务器内部转发与客户端重定向

服务器内部转发

比如在MyServlet中接收到了客户端发来的请求调用以下代码

try{
   request.getRequestDispatcher("NextServlet").forward(request,response);
} catch (ServletException e) {
    e.printStackTrace();
}

表示当前MyServlet中的请求转发给了NextServlet去处理也可能传递给下一级,再由最终的接收的servlet响应给客户端 不跳转页面  再servlet内部做处理

客户端重定向

try{
   response.sendRedirect("demo03");
} catch (ServletException e) {
    e.printStackTrace();
}

客户端请求了当前的MyServlet 但是MyServlet执行了以上代码 表示立即给客户端响应一msg,msg内容为,请立即去向NextServlet发送请求,这个时候客户端收到这条消息之后,立马去请求NextServlet并由NextServlet返回给客户端响应结果   跳转页面

Servlet保存的作用域

保存的作用域默认有四个

page   request  session applocation

page  页面级别 基本不用

ServletContext  servletContext  =  request.getServletContext();

request  一次请求中有效  request 和一次 response

session  一次会话中有效 

applocation   一次应用程序范围内有效(在Android中来理解就是app的启动到退出)

servletContext来保存数据和取数据

路径问题 : 绝对路径与相对路径

绝对路径 举例 C:\Windows\addins

相对路径  模糊路径不固定

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值