Servlet:
问题:服务器在接收到浏览器的请求后,会自动调用对应的逻辑代码进行请求处理。但是逻辑代码是由程序员编写并放到服务器中,那么服务器怎么知道该怎么调用并调用哪个类和哪个方法进行请求处理
解决:在编写代码的时候如果能够按照服务器能够识别的规则编写,浏览器按照制定的规则进行发送请求,那么服务器就可以调用并执行相应的逻辑代码进行请求处理了
实现:Servlet
概念:狭义的Servlet是指java语言实现的一个接口。广义的Servlet是指任何实现了这个Servlet接口的类。从原理是将,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器
特点:
- 运行在支持java的应用服务器上
- Servlet的实现遵循了服务器能够识别的规则,也就是服务器会自动的根据请求调用对应的Servlet进行请求处理
- 简单方便,可移植性强
使用:
- 1.创建普通的java类并继承HttpServlet
- 2.复写service方法
- 3.在service方法中书写逻辑代码
- 4.在WEB-INF文件夹下的web.xml文件中配置servlt
运行流程:
URL组成:服务器地址/端口号/webapps下的文件夹的名称/要执行的servlet的url-pattern
浏览器发送请求到服务器,服务器根据请求URL地址中的URI信息在webapps目录下找到对应的项目文件夹,然后再web。xml中检索对应的servlet,找到后调用并执行Servlet
第一个servlet
配置web.xml
配置servlet:
- 配置servlet类路径(完整的包名+类路径)
<servlet>
<servlet-name>my</servlet-name>
<servlet-class>MyServlet</servlet-class>
</servlet>
- 配置访问方式
<servlet-mapping>
<servlet-name>my</servlet-name>
<url-pattern>MyServlet</url-pattern>
</servlet-mapping>
servlet的生命周期
- 1.第一次调用到服务器关闭
- 2.如果servlet在web.xml中配置了load-on-startup,声明周期为从服务器启动到服务器关闭
注意:init方法是对Servlet进行初始化的一个方法,会在Servlet第一次加载进内存时执行
destory方法实在servlet被销毁时执行,也就是服务器关闭时
servlet中的方法
-
service方法:如果servlet中同时存在service方法,doGet,doPost方法,优先调用service方法对请求进行处理
-
doGet方法:处理get方式的请求
-
doPost方法:处理post方式的请求
注意:
- 如果在覆写的service方法中调用了父类的service方法(super.service(arg0,arg1)),则service方法处理完后,会再次根据请求方式响应doGet和doPost方法进行执行
所以一般情况下不在重写的service方法中调用父类的service方法。
Servlet常见错误:
1.404错误:资源未找到
- 原因一:在请求地址中的servlet的别名书写错误
- 原因二:虚拟项目名称拼写错误
2.500错误:
- 原因一:在web.xml中校验servlet类的全限定路径拼写错误。
- 原因二:在service方法体的代码执行导致错误
3.405错误:请求方式不支持
- 原因一:请求方式和servlet中的方法不匹配
request对象中封存了当前请求的所有信息
作用:获取请求头数据,获取请求行数据,获取用户数据
注意:request对象由tomcat服务器创建,并作为实参传递给处理请求的servlet的service方法
- 获取请求头数据:
- 获取请求方式 req.getMethod()
- 获取URL req.getRequestURL()
- 获取URI req.getRequestURI()
- 获取协议 req.getScheme()
- 获取请求行数据,键值对。根据键获取值
- 获取某个值:req.getHeader(String key)
- 获取所有键的枚举:Enumeration e = req.getHeaderNames()
- 获取用户数据
- 获取用户数据:req.getParameter(String name)
- 获取同键不同值的多组数据:String[] fav = req.getParameterValues(String name)
response
作用:用来响应到浏览器的一个对象
使用:设置响应头,设置响应实体
- 设置响应头:
- resp.setHeader(String key, String value)
- resp.addHeader(String key, String value)
- 设置相应状态码
- resp.sendError(int state, String info)
- 设置响应编码格式
- resp.setHeader(“content-type”,“text/html;charset=utf-8”)
- resp.setContentType(“text/html;charset=utf-8”)
- 设置响应实体
- resp.getWriter()
service请求处理代码流程:
- 获取请求数据
- 处理请求数据
- 创建业务层对象
- 调用业务层对象的方法
- 设置响应编码格式
- 响应处理结果
Servlet流程总结
- 浏览器发起请求到服务器
- 服务器接受浏览器请求,进行解析,创建request对象存储请求数据
- 服务器调用对应的servlet进行请求处理,并将request对象作为实参传递给servlet的方法进行请求处理