因为网页时http协议的,所以所有的网页都遵循http协议,发给后台的协议也是http协议的。
转型时,由父接口的ServletRequest转为子类的HttpServletRequest,需要强转(继承GenericServlet时)
此时的HttpServletRequest.getMethod()是获取请求的类型(get/post)
重写servlet方法httpServletRequest,获取用户请求类型,根据请求类型去执行相关代码
注释:当一个类继承于另一个类,子类中没有父类的方法时。用子类的对象调用方法时,会首先在子类中查找,如果子类中没有改方法,再到父类中查找。
get的处理效率高,所以尽可能的使用get 的方法
基本实现步骤
第一步:调用 MyServlet的service(ServletRequest, ServletResponse)方法,但是MyServlet没有重写这个方法,所以到MyServlet的父类去找
第二步:调用HttpServlet的service(ServletRequest, ServletResponse)方法,查看源码发现它调用了service(HttpServletRequest, HttpServletResponse)
第三步:查看HttpServlet的service(HttpServletRequest, HttpServletResponse)方法,发现它对请求方法进行了判断,如果是GET请求,则调用doGet()方法,如果是POST请求,则调用doPost()方法。
第四步:如果在MyServlet中重写了 doGet(),doPost()方法,则会调用MyServlet中的重写的响应的doGet(),doPost()方法。
注意:必须重写一个doXXX方法,不然会报405
后台获取前台的数据
request.getParameter("name");
后台响应给浏览器
先设置响应格式
response.setContentType("text/html;charset=utf-8");
然后输出
response.getWriter().write(name);
注意:Servlet体系结构是建立在Java多线程机制之上的,这样会出现线程的问题,原因,servlet是单实例的,多次访问,共用一个name对象,张三李四账户登陆问题;目前学习的只能加锁(加静态代码块),效率很差,放在后期的学习中解决。
ØServlet容器会自动使用线程池等技术来支持系统的运行,当两个或多个线程同时访问同一个Servlet时,可能会发生多个线程同时访问同一资源的情况,数据可能会变得不一致。
当然,也有封装好的简便方法,非解决安全问题
Servlet的加载
load-on-startup
1
load-on-startup 元素标记容器是否应该在web应用程序启动的时候就加载这个servlet,(实例化并调用其init()方法)。
它的值必须是一个整数,表示servlet被加载的先后顺序。
如果该元素的值为负数或者没有设置,则容器会当Servlet被请求时再加载。
如果值为正整数或者0时,表示容器在应用启动时就加载并初始化这个servlet,值越小,servlet的优先级越高,就越先被加载。值相同时,容器就会自己选择顺序来加载。