JavaWeb基础
Java Web
JavaWeb工作原理
Web应用程序
Web服务器
Web浏览器
HTML文件
HTTP协议(超文本传输协议)
位于TCP/IP协议的应用层(顶层)
TCP协议是长连接,HTTP是短连接
HTTP协议主要特点
1.遵循请求/响应模型
无连接
无状态
工作流程
建立连接
发送请求信息
HTTP请求包括请求行、请求头、空行、消息体
请求行由三部分组成:请求方法、URL、HTTP版本
请求方法有8中,常用GET和POST
回送响应信息
HTTP响应包括状态行、响应头、空行、消息体
状态行中的状态码有5种
1xx:信息,请求收到,继续处理
2xx:成功
3xx:重定向,为了完成请求,必须进一步执行的动作
4xx:客户端错误
5xx:服务端错误
关闭连接
Web服务器缺陷
只能提供静态页面
CGI程序:多进程,无法实现高并发
Java的解决方案:Servlet及Web容器
Servlet(无main方法,属于javaEE)
主要任务
读取浏览器发送的数据
做业务处理,生成结果
给浏览器做响应
Web容器
负责Servlet的管理和运行
通信支持
生命周期管理
多线程支持
JSP支持
处理安全性
Web容器和Servlet对请求和响应的处理总结
JavaWeb page12-13
JavaWeb应用程序的组成
配置文件:web.xml(必须在WEB-INF目录下),浏览器只能访问到WEB-INF外面的文件
静态文件
类文件和包
Web容器Tomcat
目录结构
bin:启动和关闭服务器
lib:共用的jar文件
logs:日志
webapps:应用程序部署目录
发布Web应用
打war包命令:jar cvf myweb.war html images jsp WEB-INF *.html *.jsp
Servlet基础
Servlet规范
Web应用程序
Servlet和HTTP Servlet
过滤器
安全
国际化
Servlet API
HttpServlet继承GenencServlet,GenencServlet实现了ServletConfig和Servlet接口
开发Servlet程序的步骤
1.自定义类继承httpServlet
2.重写doGet和doPost方法
3.在web.xml中做配置
Servlet中不能用全局变量,线程安全问题
解决1:用局部变量
解决2:线程同步 synchronized
Servlet 生命周期
五个过程:创建、初始化、提供服务、销毁、GC回收
创建(构造器)
初始化:init方法
服务:调用Service方法(它去调用doGet或doPost)
销毁:调用destroy方法
GC卸载
正常情况下,服务可以执行多次,其他只执行一次。在长时间没有发送请求后,需要重新创建Servlet
Servlet默认是多线程的,因此给定时间内容器只装载一个Servlet实例
Servlet基本配置
<url-patttern>匹配规则三种
完全匹配:<url-pattern>/servlet/MyServlet.do</url-pattern>
目录匹配:<url-pattern>/servlet/*</url-pattern>
扩展名匹配:<url-pattern>*.do</url-pattern>
容器查找规则:首先查找完全匹配,找不到则查找目录匹配,如果还找不到就查找扩展名匹配。一个请求可以匹配多个目录匹配,容器最终会选择最长的目录匹配
Servlet初始化配置
在一个Servlet元素中使用<init-param>、<param-name>、<param-value>元素
访问初始化参数
this.getServletConfig().getInitParameter(String name)
this.getInitParameter(String name)
ServletContext应用上下文对象
概括
属于整个Web应用程序
可以访问到Web应用程序资源的本地输入流
把资源的虚拟路径转换为物理路径
记录事件日志
绑定一个对象在整个Web应用程序中共享
获取应用上下文对象
ServletContext context= this.getServletConfig().getServletContext()
ServletContext context= this.getServletContext()
常用方法
context.getRealPath():将虚拟路径转换为部署到服务器那边的真实物理路径
数据共享
context.setAttribute("username","张三"):在应用上下文中保存数据(可以存任何数据类型)
context.getAttribute("username"):在应用上下文中取出数据(根据键取出值,再强转)
getInitParameter():获得全局的初始化参数(初始化配置中,在Servlet元素外用<Context-Param>元素)
使用Servlet处理HTTP响应
HttpServletResponse对象用于创建响应
设置响应状态行
五类状态码
1xx:信息,请求收到,继续处理
2xx:成功
3xx:重定向,为了完成请求,必须进一步执行的动作
4xx:客户端错误
5xx:服务端错误
设置状态码
setStatus()方法,例:resp.setStatus(HttpServletResponse.SC_NOT_FOUND)
两种专用方法
sendError(HttpServletResponse.SC_NOT_FOUND,"你输入的路径有错") 生成一个404应答, 可以自定义错误信息!
sendRedirect(String URL)重定向,用于跳转页面或跳转Servlet!
重定向跳转Servlet时写的路径不加/
原理:首先将状态码设置为302,再根据响应头里Location的URL地址,重新发送请求
设置响应头
setHeader(name,value)
自定义响应头:resp.setHeader("username", "张三");
通过Content-Type响应头告诉浏览器响应的数据类型是普通HTML文本:resp.setHeader("Content-Type", "text/html");
setContentType(String mimetype)
Content-Type值的类型,叫做MIME(Multipurpose Internet Mail Extending)
text/html
text/plain
image/jpeg
设置响应消息体
传递文本流getWriter()
传递二进制流getOutputStream()
下载文件
使用Servlet处理HTTP请求
浏览器向服务器发HTTP请求的四种方式
地址栏输入 Get
超链接 Get
表单提交 Get/Post
表单提交中传输二进制数据,只能使用POST方法
改变默认编码集 enctype="multipart/form-data"
开启Servlet3.0文件上传开关 @MultipartConfig
提交方法 method="post"
AJAX Get/Post
GET/POST方法比较
GET
提交数据类型:文本
提交数据长度:不超过255个字符
提交数据可见性:作为URL地址的一部分显示在浏览器地址栏
提交数据缓存:缓存在浏览器URL历史状态中
POST
提交数据类型:文本,二进制文本
提交数据长度: 没有限制
提交数据可见性: 作为请求的消息体,不可见
提交数据缓存:不会被浏览器缓存
如何选择GET/POST方法
请求一个静态页面或图形文件时使用GET方法,因为仅仅需要发送文件名
发送大数据的时候使用POST方法
上传文件时使用POST方法
发送用户名、密码或其他保密信息的时候使用POST方法
获取HTTP协议请求行
获取HTTP协议请求头
request.getHeader("User-Agent");
获取HTTP协议消息体
获取表单数据
request.getParameterValues("hobby") 返回字符串数组
request.getParameter("sex")返回字符串
请求转发
request.getRequestDispatcher("/FromServlet").forward(request, response);跳页面或者Servlet
一次请求一次响应。请求转发在服务器内部完成,而重定向由浏览器完成,重定向至少两次请求两次响应
使用request对象作为仓库
传数据线程安全(只在一次请求一次响应中有效)