1.servlet不建议自定义构造方法,不安全,可能时无参数构造方法消失,导致无法实例化。把一些初始化操作写在service()中。
servlet对象不能自己来new,自己new的servlet对象不受tomcat管理。 可能不会被回收
地址栏上提交请求,才执行doget()方法:要在地址栏填写xx=xxx
2.http请求报文有多种类型,最常用的是get,post请求
到目前为止,只有一种情况可以发送POST请求:使用form表单,并且form标签中的method属性值为:method="post"。
其他所有情况一律都是get请求:
- 在浏览器地址栏上直接输入URL,敲回车,属于get请求。
- 在浏览器上直接点击超链接,属于get请求。
- 使用form表单提交数据时,form标签中没有写method属性,默认就是get
- 或者使用form的时候,form标签中method属性值为:method="get"
- ....
3.get和post请求选择
无论是get还是post请求,都遵循了http协议,都被封装在HTTPServletRequest中,由tomcat来解析。服务器把解析的对象封装在HTTPServletRequest对象中。 coder可以直接使用HTTPServletRequest对象的方法。
4.HttpServlet源码分析
继承关系: servlet-->genericServlet --> HttpServlet--> (我们自己的写的myServlet)
- servlet接口中5个方法:init(), service(), destroy()
- genericServlet覆写: init(ServletContext 参数){ ;init()},init()
- HttpServlet:
service(ServletRequest rq, ServletResponse rp){把ServletRequest类型强转成HttpServletRequest 类型}
service(HttpServletRequest rq, HttpServletResponse rp){ 对request类型进行判定,是get/post/...方法,分别执行doget()/ dopost() }
doGet(显示错误). doPost()...
myservlet中传入Request请求:
- 执行init(),genericServlet中的init(ServletContext 参数)方法
- 执行service(),HttpServlet中的service(ServletRequest rq, ServletResponse rp)方法,该方法会ServletRequest类型强转成HttpServletRequest 类型,然后执行service(HttpServletRequest rq, HttpServletResponse rp)方法。
- 判定Requst请求的类型,假设get请求,如果myservlet中没有覆写doget(),会去调用父类HttpServlet的doget(),父类的doget()执行会显示错误
- 因此我们必须在myservlet中覆写doget()或dopost(),根据请求类型来判定重写哪个方法。
5. servlet开发步骤
6.欢迎页面
a.CATALINA_HOME/conf/web.xml文件中进行配置(全局配置)。默认index.html/index.jsp/ index.htm 是欢迎页面
b.webapp内部的web.xml文件中自己配置欢迎页面
- 如果自己在web.xml中配置了,则全局配置失效
- 可以同时设置多个欢迎页面,按照顺序排优先级
- 欢迎页面设置路径 一定不要以“/”开始, 默认从webapp的根路径下寻找。
- 也可以设置动态的欢迎页面,路径对应<mapping>中类的url
7.Request对象的方法
a.parameter 4兄弟
- 一次请求对应一个request对象
- request对象存储前端传来的数据的方式: map(String ,[ ]String)
- 因为可能有复选框,同一个name对应好几个value
- 浏览器往服务器提交的是字符串。即使穿的是数字110,也是以String类型传递。
- String getparameter(String name)最常用 是获得每个name的第一个value (大部分都只有1个value,只有少数复选框有多个value)
- 4兄弟都是获取前端浏览器提交的数据
实现request的几个方法 servlet类编写 获取页面传入的数据
b.attribute3兄弟
这3个方法servletContext也有
void setAttribute(String name, Object obj); // 向域当中绑定数据。
Object getAttribute(String name); // 从域当中根据name获取数据。
void removeAttribute(String name); // 将域当中绑定的数据移除
如何从一个servlet绑定的数据,在另一个servlet使用? 请求转发机制
c.设置字符编码utf-8 解决乱码问题
只作用于请求体(post请求中数据所在的位置),不作用于请求行(get请求)
d.其他方法
8. ServletContext应用域对象|| request请求域对象
1个servlet只创建一个ServletContext对象
服务器启动的时候,就创建了应用域对象。 所有用户共享
1次请求对应一个request对象。只有发起请求的时候才会创建request对象
9.请求转发 2个servlet贡献数据 RequestDispatcher
不可以,因为servlet不允许程序员自己创建,(会不受tomcat的管理)