一:

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请求@Overrideprotected 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->ServletServlet中的核心方法服务方法:当有请求过来时service方法会自动响应(Tomcat容器调用)

三:servlet的生命周期

1)生命周期:从出生到死亡的过程就是生命周期。对应Servlet中的3个方法init,service,destroy2)默认情况下,第一次接受请求会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 datajson格式:有请求体request payload-响应:响应也包含三个部分:1.响应行 2.响应头 3.响应体响应行包含三个信息:1.协议 2.响应状态码 3.响应状态响应头:包含了服务器的信息、服务器发送给浏览器的信息(内容的媒体类型、编码、长度)响应体:响应的实际内容()

五:会话

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

Web中Servlet相关推荐

  1. 用servlet路径访问一个html,java web中servlet、jsp、html 互相访问的路径问题

    在html">java web种经常出现 404找不到网页的错误,究其原因,一般是访问的路径不对. html">java web中的路径使用按我的分法可以分两种情况,当 ...

  2. 在html中用表单插入servlet 怎么写servlet的地址,java web中servlet、jsp、html 互相访问的路径问题。...

    假设在myapp项目下有个login.html,index.jsp,还写了两个servletA和servletB. 在web.xml中的地址配置: /servlet/servletA /servlet ...

  3. part.write java_小白向:web中利用request.getPart()上传文件到服务器

    被文件上传弄得焦头烂额的一天,果然web中的路径和各种设置真的好讨厌= = 下面是超级小白的.及其简约的"详"解 1.明确目的: 用户将 1.txt 文件 上传到 服务器(web工 ...

  4. 模拟Spring如何在WEB中运行

    Spring在web中配置和普通的Java程序中有所区别,总结一下主要表现在以下几个方面: ①jar包不同,需要引入两个web的jar包 ②需要考虑IOC容器创建的时间 非 WEB 应用在 main ...

  5. java servlet 输出_JavaWeb中servlet读取配置文件的方式

    我们在JavaWeb中常常要涉及到一些文件的操作,比如读取配置文件,下载图片等等操作.那我们能不能采用我们以前在Java工程中读取文件的方式呢?废话不多说我们来看看下我们以前在Java工程中读取文件是 ...

  6. Java Web中的中文编码问题分析

    一.为什么需要编码 在计算机中存储信息的最小单位是1个字节,即8bit,所以能标识的最大字符范围是0~255,而人类自然语言中例如汉语.日语要表示的符号太多,无法单纯用一个字节来完全表示,为了解决这个 ...

  7. java 控制jsp_JSP学习之Java Web中的安全控制实例详解

    普通用户界面 修改登录的Servlet,修改后的代码如下: LoginProcess.java代码: package servlet; import javabean.User; import jav ...

  8. 第三章 深入分析Java Web中的中文编码问题

    3.1 几种常见的编码格式 3.1.1 为什么要编码 一个字节 byte只能表示0~255个符号,要表示更多的字符,需要编码. 3.1.2 如何翻译 ASCII码:有128个,用一个字节的低7位表示. ...

  9. 使用Intellij idea新建Java Web项目(servlet) 原理及初步使用

    准备 JDK       (配置JDK_HOME\bin   和 CLASSPATH)   注:JDK8下载已经需要注册了,请使用JDK11(现在是官方长期支持的版本)     对于我们新手来说,JD ...

最新文章

  1. 通过反射获取子类和父类定义的属性
  2. Mybatis排序无效问题解决
  3. 马化腾内部讲座:让产品自己召唤人
  4. 微服务Springcloud超详细教程+实战(二)
  5. hibernate执行sql语句 查询 删除
  6. java quickhit项目_【QuickHit项目实例】
  7. 文件下载的java代码_文件下载java代码实现
  8. Android Studio全局搜索Ctrl+Shift+F占用解决
  9. JavaScript练习
  10. coreseek使用
  11. 新旧Oracle客户端连接远程oracle数据库
  12. 2021年山东省安全员A证考试内容及山东省安全员A证新版试题
  13. Observer (观察者) 模式
  14. Unity Shader零基础入门4:纹理贴图与法线贴图
  15. 把幽灵和熔断关闭_比较幽灵和三巨头
  16. c语言让数码管显示时间,请问51单片机肿么编写程序让8个数码管显示时间(时分秒)...
  17. MYSQL 判断一个时间段是否在另一个时间段内。
  18. java人力资源管理系统工作职责_JavaWeb课设——人力资源管理系统
  19. 我原本明天就是我从业5年
  20. centos 删除文件夹失败 centos cannot remove ****, is a directory

热门文章

  1. 前端学习(2267)vue造轮子之添加icon
  2. 前端学习(2207):Vue-store文件夹的目录结构
  3. 前端学习(2116):为什么组件data必须是函数
  4. 前端学习(1988)vue之电商管理系统电商系统之获取商品列表
  5. 第三十六期:如果把线程当作一个人来对待,所有问题都瞬间明白了
  6. [资源]推荐一些Python书籍和教程,入门和进阶的都有!
  7. 测试nb信号的软件_NB-IOT的OTA测试(功率、灵敏度测试)
  8. action请求是什么意思_凭什么说大疆Osmo Action可以干掉 GoPro hero7?
  9. Kubernetes tutorial - K8S 官方入门教程
  10. MongoDB系列四(索引).