一、以添加数据为例
在add.html页面的表单中,我们输入数据,通过点击添加操作,根据action发给我们服务器端的add组件,这个add组件会用JDBC中添加的方法向数据库中添加数据。
1、add组件
AddServlet
servlet(服务器端的一个应用组件),add指实现添加的功能。
需要完成的事情:
该类需要继承HttpServlet才可以实现以上的工作(在Tomcat的lib文件中的servlet-api.jar)
添加依赖:
点击+,导入我们的servlet-api.jar即可使用
dopost() 会响应我们method=post 的请求
doget()同理
2、HttpServletRequest
当用户在add.html页面中填入数据之后点击添加操作,相当于向我们的服务器端发送了一个请求,
于是将表单里的数据都会存储在这个请求之中,我们可以通过 HttpServletRequest定义的变量来获取。
3、如何将表单上的action和addServlet对应上?
在web.xml文件中配置如下:
<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>
1、用户发请求action=add
2、项目web.xml 文件中找到url-pattern =/add
3、接着找上面的servlet-name
4、找和servlet-mapping中和servlet-name一致的servlet(既第二行的servlet-name :AddServlet)
5、接着就能找到serlvet-class
6、最后根据用户发送的请求的method来找到AddServlet中的与method对应的方法
接下来之后服务器端跟数据库连接即可(FruitDAO是提前写好的)
public class AddServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");String fname = req.getParameter("fname");String priceStr = req.getParameter("price");Integer price = Integer.parseInt(priceStr);String fcountStr = req.getParameter("fcount");Integer fcount = Integer.parseInt(fcountStr);String remark = req.getParameter("remmark");FruitDAO fruitDAO = new FruitDAOImpl();boolean flag = fruitDAO.addFruit(new Fruit(0,fname, price, fcount, remark));System.out.println(flag? "添加成功":"添加失败");}
}
在web.xml文件中,若配置多个servlet-name建立连接 会web-app下会出现错误。只需要根据关于servlet中web.xml web-app报错 解决方案_石中玉大帅哥的博客-CSDN博客j
即可解决
2、Servlet的继承关系
javax.servlet.Servlet接口
javax.servlet.GenericServlet 抽象类
javax.servlet.http.HttpServlet
2.1 相关方法
后面的子类都会实现这些方法
init() 初始化方法
service 服务方法:当有请求过来,该方法会被执行(Tomcat容器来调用)
在genericServlet中也是抽象的方法
在HttpServlet中会分析请求方式,在决定调用哪个do方法,do方法默认都是405的实现风格(需要我们实现这些请求方法,否则默认报405)
destroy 销毁方法
2.2 service方法
各种if判断,根据表单中的请求方法来决定调用哪一个do方法(默认为get)
3、Servlet的生命周期
3.1
也是由Tomcat容器来控制
默认情况下:
第一次接受请求时会进行实例化(调用构造方法)[这里调用底层的方法],初始化(init方法)、然后服务调用service,当容器关闭时所有的servlet会被销毁,调用destroy方法。
*实例化和初始化Tomcat只会创建一次,所有的请求都是使用这个实例来响应。
如何实例化对应的serlvet
当在servlet中自己重写构造方法时候,访问demo02的时候就会出现这样的错误
意思是说无法初始化这个servlet实例去调用那些init、service方法.......
(因为原本的构造函数里通过java的方法会创建这个实例)。
3.2 Servlet的初始化时机
-默认是第一次接受请求时候,实例化初始化
-也可以通过<load-on-startup>来设置启动的先后顺序,数字越小启动越靠前
Servlet在容器中是单例的、线程不安全的
单例:无论哪个servlet发送请求过来,tomcat容器都只会实例化一个对象,都是使用该对象来调用各个组件的
4、保存作用域
page :页面级别
request :一次请求响应的范围
session :一次会话
application :一次应用程序
补充
servlet3.0之后支持注解
因此在web.xml中不需要一个一个去注册组件
只需要增加对应的注解即可
路径问题
../ 回到上级
在login.html中 如何连接css样式中的login.css
答: ../css/login.css 相对路径的写法
当主体是shopping.html,如何连接css样式中的login.css
答:../../css/login.css 相对路径的写法
JavaWeb网页的错误代码:
404:找不到对应资源
405:一般是表单提交的方法在组件里面不存在这个方法的重写,比如表单的提交方式为get, 在servlet组件中就需要有一个doget()方法,如果没有就调用原本的doget方法,就会报405
500:服务器端的错误