Web中Servlet

一:

web.xml中的代码如下

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>AddServlet</servlet-name>
    <servlet-class>servlets.AddServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>AddServlet</servlet-name>
    <url-pattern>/add</url-pattern>
  </servlet-mapping>
  <!--
   用户发请求 action=add
   当前项目中 web.xml中找到url-pattern=/add
   找12行的名字 servlet-name =Addsevlet
   找到和servlet-mapping中servlet-name一致的servlet,即第8行
   找到第八行servlet-class
   用户发送的post请求 ,因此会执行AddServlet中的doPost方法
  -->
</web-app>

通过url-pattern找到对应的servlet-name(目前简单这样子理解,之后学习的过程中会注意)

在根据servlet-name找到我们创建的类所需要初始化的服务。

​
public class AddServlet extends HttpServlet {
    //响应页面中的post请求
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //post方式下设置编码防止中文乱码   get方式目前不需要(基于tomcat8)
        //设置编码这一句必须在参数获取之前设置
        req.setCharacterEncoding("UTF-8");

        String fname = req.getParameter("fname");
        String pricestr = req.getParameter("price");
        int price = Integer.parseInt(pricestr);
        String fcountstr = req.getParameter("fcount");
        int fcount = Integer.parseInt(fcountstr);
        String remark = req.getParameter("remark");

        FruitDAO fruitDAO = new FruitDAOImpl();
        boolean flag = fruitDAO.addFruit(new Fruit(0, fname, price, fcount, remark));
        System.out.println(flag?"添加成功!":"添加失败");
    }
}

​

二:细节

2.servlet的继承关系
    (1、继承关系:
    javax.servlet.Servlet接口
        javax.servlet.GenericServlet抽象类
            javax.servlet.HttpServlet 抽象子类

    (2、相关方法:
    Servlet:
       void init(config)-初始化方法
       void service(request,response) -服务方法
       void destroy()-销毁方法

    javax.servlet.GenericServlet:
       void service(request,response) 仍然是抽象的

    javax.servlet.HttpServlet:
       void service(request,response)
            (1.String method = req.getMethod(); 获取请求的方式
                各种if判断,根据请求方式不同决定去调用不用的do方法
                在httpservlet抽象类中,do方法都差不多

    (3.小结:
        继承关系 HttpServlet->GenericServlet->Servlet
        Servlet中的核心方法
        服务方法:当有请求过来时service方法会自动响应(Tomcat容器调用)

三:servlet的生命周期

1)生命周期:从出生到死亡的过程就是生命周期。对应Servlet中的3个方法init,service,destroy
    2)默认情况下,第一次接受请求会Servlet会使用反射进行实例化(调用构造方法())、初始化(init())然后服务(service())
        第二次请求开始每一次都会服务,
        当容器关闭时所有的servlet实例会被销毁
    3)通过案例发现:Servlet实例Tomcat只会创建一个,所有请求都依赖这个实例去响应
        第一次请求时会初始实例化
        好处:提供系统的启动速度
        坏处:第一次请求时耗时较长
        因此,如果要提高响应速度则需要设置Servlet的响应时机
    4)Servlet初始化时机:
        默认是第一次请求时 初始化
        可以通过web.xml中的 <load-on-startup>设置启动时机,数字越小启动越靠前
    5)Servlet在容器中是单例、线程不安全的
        因此尽量不要再Servlet中定义成员变量。
            如果不得不加成员变量:
                不要修改成员变量的值
                不要根据成员变量的值做一些判断

四:HTTP协议

HTTP:Hyper Text Transfer Protocol 超文本传输协议
1)HTTP是无状态的
2)HTTP请求响应包含两个部分:请求和响应
    -请求:
    请求包含3个部分;1.请求行;2、请求消息头 3、请求主体
        请求行包含三个信息:1.请求的方式 2.请求的URL 3.请求的协议版本。
        请求消息头中包含许多客户端需要告诉服务器的信息,比如浏览器的星号、版本、客户端接受的类型、发送内容的类型等等
        请求体:三种情况
            get方式,没有请求体,但有queryString(紧跟url之后)
            post方式:有请求体,form data
            json格式:有请求体request payload
    -响应:
    响应也包含三个部分:1.响应行 2.响应头 3.响应体
        响应行包含三个信息:1.协议 2.响应状态码 3.响应状态
        响应头:包含了服务器的信息、服务器发送给浏览器的信息(内容的媒体类型、编码、长度)
        响应体:响应的实际内容()

五:会话

1)-HTTP是无状态的:服务器无法判断两次请求是不是一个客户端发过来的
   -现实问题:第一次请求是添加商品到购物车 第二次请求是结账;
        如果无法区分是不是一个客户端发过来的就会发生混乱(我结账结的别人的购物车)
   -通过会话跟踪技术解决无状态的问题
2)会话跟踪技术
    -客户端第一次发送请求给服务器,服务器获取session,获取不到则创建新的,然后响应给客户端
    -下次客户端给服务器发送请求时,会把sessionId带给服务器,服务器会判断这次请求和上次请求是同一个客户端,从而能够区分
    -常用的API:
        request.getSession() ->获取当前的会话,没有则创建新的会话
        request.getSession(true) ->效果和不带参数的一样
        request.getSession(false) ->获取当前会话,没有则返回Null,不会创建新的session

        session.getId() ->获取sessionID
        session.isNew() ->判断当前session是否是新的
        session.getMaxInactiveInterval() ->session的非激活间隔时长默认为1800s,(即不操作的情况下session的存在时长)
            session.setMaxInactiveInterval() ->设置非激活间隔时长
        session.invalidate() ->强制性让会话立即失效

3)Session保存作用域
    session的保存作用域和某个具体的session是对应的
    常用的API:
        void session.setAttribute(k,v)
        Object session.getAttribute(k)
        void removeAttribute(k)

六:

1)服务器内部转发:request.getRequestDispatcher("...").forward(request,response)
    一次请求响应的过程,对于客户端而言内部的变化不知道
    地址栏没有变化
 
2)客户端重定向:request.sendRedirect("...")
    两次请求的响应,客户端知道URL的变化
    地址栏有变化

 

 
七:Thymeleaf -视图模板技术

//servlet3.0开始支持注解的方式注册
@WebServlet("/index")
public class IndexServlet extends com.atguigu.myssm.myspringmvc.ViewBaseServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        FruitDAO fruitDAO = new FruitDAOImpl();
        List<Fruit> fruitList = fruitDAO.getFruitList();
        //保存到session中
        HttpSession session = req.getSession();
        session.setAttribute("fruitList",fruitList);

        //处理模板
        //Thymeleaf会将index这个逻辑视图的名称对应到物理视图名称上去
        //逻辑视图名称:index
        //物理视图名称:view-prefix + 逻辑视图名称 +view-suffix
        //所以真是的视图名称为    /     index     .html
        super.processTemplate("index",req,resp);
    }
}

​
1).添加Thymeleaf.jar包
2)新建一个servlet类叫viewbaseServlet(从Thymeleaf中拷入)
3)在web.xml文件中添加配置
    配置prefix和suffix
4)使servlet类继承与viewbaseServlet
5)根据逻辑视图名称得到物理视图名称
      //处理模板
      //Thymeleaf会将index这个逻辑视图的名称对应到物理视图名称上去
     //逻辑视图名称:index
     //物理视图名称:view-prefix + 逻辑视图名称 +view-suffix
     //所以真是的视图名称为    /     index     .htmlb

八、保存作用域

(1)page(不用了)
(2)request
    一次响应的请求范围

通过请求2无法获得lili这个数据

(3)session
    一次会话的范围
(4)application
    一次应用程序的范围(直到Tomcat停止)

 

其他:

//200:正常响应
//404:找不到资源
//405:请求方式不支持
//500:服务器内部错误

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值