java web 应用程序组成
- WEB-INF目录的内容不能被客服端直接访问,存放一些比较隐蔽的信息;
- WEB-INF–classes 存放开发者书写业务类编译生成的class文件
- WEB-INF–lib 用于存放web应用程序中使用的jar包
- WEB-INF–web.xml 用于web组件的注册
- *.html
- *.jpg
- *.css
- *.js
tomcat 目录结构
- bin目录用于存放tomacat中的可执行文件
- 其中startup.bat用于启动tomacat
- 其中shutdown.bat用于关闭tomacat
- conf用于存放tomacat的配置文件
- 其中server.xml用于tomacat服务器的相关配置,
<Host name="localhost" appBase="webapps"
unpackWARs=”true” autoDeploy=”true”>“
- appBase 描述tomacat中存放web程序的目录
- unpackWARs 当web应用程序目录中有war文件,则自动解压;
- web.xml用于tomacat中web应用相关的配置
- lib目录用于存放tomcat运行时所使用的jar包,其中serverlet-api.jar是根据tomcat根据serverlet规范提供的实现类
- logs 目录用于存放日志文件
- temp 目录用于存放临时文件
- webapps 用于存放web应用程序的目录
- work 用于jsp支持
web服务器 web容器 web应用服务器的区别
- web服务器的主要作用,开启服务器,坚听端口,接受请求,产生响应,只能产生静态的html响应信息,极大影响响应信息的灵活性;
- web容器是辅助应用的一中解决方案.将请求信息处理完成后,动态产生响应信息;
- web服务器+web容器,合称web应用服务器;
servlet
- api结构
- servlet业务接口 service方法
- serviceConfig 配置接口
- genericServelet 适配器类,实现了两个接口中大部分方法,但是没有实现service方法,该方法有genericServelet的子类根据自身协议特点实现
- httpservlet genericServelet的子类,专门针对http协议书写的子类,重写了service方法,根据请求方式的不同,分别调用doxx();
3种方式访问
<a href='ad'>adf</a>
form 提交
- testweb/all
servlet请求路径问题
- 在form的action属性中,直接写servlet的URL路径,默认在当前目录下查找,一旦网页在子目录中,那么会在提交路径中加上子目录的名称,可以通../回到上一级目录
- 如果目录比较深,频繁用../很繁琐,而且移植性不好,可以在URL路径中,以/开始,表示webapps根目录,再加上部署名,在书写servlet请求路径
servlet url路径书写方式
- 精确方式 /abc 表示只能以/abc路径查找servlet
- 扩展映射 *.aa 表示凡以.aa结尾的请求都能访问servlet
- 路径映射 /abc/*表示凡是以/abc/路径下的请求都能访问servlet
servlet生命周期
- 启动tomcat,读取conf下的server.xml,以确定启动端口和web应用程序的部署目录
- 读取部署目录中所有的web应用程序中的web.xml,并解析,一旦有一个web应用程序的web.xml书写错误,那么解析失败,从而抛出解析异常;正确解析web.xml,可以确定部署的web组件信息;
- 加载并实例化servelet,1 标签,如果该标签的值为0或正数,表示web容器一起动就实例化,如果不写或为负数,表示第一次访问再实例化;
- 调用init()方法完成初始化
- 当请求到达后,调用service完成业务
- 销毁阶段,调用destroy()完成清理工作
- 在整个生命周期中1 2 3 4 6 都执行一次,只有5 每次请求都会执行,而且servlet对象只有一个,是单实例多线程的类;
在注册serverlet时
可以加入
ff
111
进行serverlet的初始化信息的描述,可以通过servletconfig配置对象中的getinitparameter()根据参数名称,得到参数值,但该初始化只能在当前servlet中使用,不能在别的servlet中使用
获取流 一次只能获取一种 不能同时使用
@override 强制检测子类是否重写父类的方法
depreated 过时
状态行 分为 HTTP协议 状态码 状态描述
- 状态码
- 100-199 表示信息代码,客户端应采取的其他动作,请求正在进行
- 200-299 客户端请求成功
- 300-399 表示用于已经移走的资源文件,指示新的地址
- 400-499 客服端引发的错误
- 500-599 服务器端引发的错误
状态码设置
- 在使用printwriter向客户端输出信息之前,设置状态码;
响应头设置
- 通过响应对象 HttpServletResponse 的 setheader() 可以设置响应头,但是响应头必须要被浏览器识别才有意义,所以通常会把响应头的设置封装成响应对象的方法 比如:setContentType() addCookie()
- 由于只有http协议才有响应头,所以setheader()只存在与HttpServletResponse中
HttpServletResponse向客户端输出数据
- getwriter()得到打印字符,可以向客服端输出数据
- getoutputstream()得到输出字节流,可以向客户端输出二进制数据;
重定向流程
- 客户端访问服务器,服务器调用response.sendredirect();产生响应时,会产生302状态码,同时产生location响应头,客户端浏览器在接收到响应信息后,发现是302状态码,然后将该内容更新浏览器地址栏,再向服务器发出第二次请求;
异常
- java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed;
- response.sendRedirect()提交之后不能再response.sendRedirect();
get方式
- 用户在网页中点击超链接
- 用户提交网页上填好的表单
- 用户在浏览器地址栏中输入URL地址并回车
post方式
<form method = 'post' action = ''></form>
get和post的差别
- 流的格式的区别:get方式表单数据附加在URL后面,而post方式表单数据在消息体中,所以get没有消息体
- 用途的差别:get方式主要用于资源的查找。post方式主要用于数据的传输;
- 传输性能区别:get方式只能传输文本数据,post可以传输文本和二进制数据;get方式不能传输大数据,而post可以传输大数据;get方式表单数据附加在URL后面,所以表单数据会在浏览器地址栏中显示出来;而post表单消息的早消息体中,不会在地址栏显示,相对安全;get方式的数据会在浏览器中缓寸,而post不会缓存