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对象作为仓库

传数据线程安全(只在一次请求一次响应中有效)

原文地址:https://www.cnblogs.com/rookie97/p/12043749.html