前四节为JavaWeb需要的前置知识和必要的环境配置,第五节Maven用于导入和管理jar包,可以跳过。
Javaweb:在Java中动态web资源开发的技术。
静态网页:提供给所有人看的数据都不会发生变化。
动态网页:数据会随不同人,不同时间,不同地点而改变。
web应用程序:可以提供浏览器访问的程序。
动态web缺点:
动态web优点:
ASP:
<%
System.out.println("hello");
%>
PHP:
JSP/Servlet:
服务器是一种被动的操作,用来处理用户的一些请求和给用户的一些响应信息;
IIS: 微软开发的,是Windows中自带的服务器,采用ASP语言
Tomcat: 一个免费的开放源代码的Web 应用服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求,是开发和调试JSP 程序的首选。
什么是HTTP
两个时代
百度(General:请求响应都会包含):
Request URL: https://www.baidu.com/ 请求地址
Request Method: GET get方法/post方法
Status Code: 200 OK 状态码:200
Remote Address: 39.156.66.18:443 远程地址(百度的地址+端口)
1.请求行
2.消息头
Accept: 告诉浏览器,它所支持的数据类型
Accept-Encoding: 支持哪种编码格式 GBK、UTF-8、GB2312
Accept-Language:告诉浏览器它的语言环境
Cache-C:ontrol:缓存控制
Connection:告诉浏览器,请求完成是断开还是保持连接
百度:
Cache-Control: private 缓存控制
Connection: keep-alive 连接保持
Content-Encoding: gzip 编码
Content-Type: text/html;charset=utf-8 类型
1.响应体
2.状态码:
200:响应成功
3xx:请求重定向(重定向:重新定位到新位置去
)
4xx:找不到资源
5xx:服务器代码错误
Tomcat 是Web应用服务器,是一个Servlet/JSP容器。
Tomcat 作为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户
https://tomcat.apache.org/download-80.cgi
startup.bat启动
shutdown.bat关闭
访问测试:http://localhost:8080/
Tomcat文件作用:
bin:存放启动、停止等批处理脚本和Shell脚本
conf:配置文件
servel.xml:服务器核心配置文件
启动端口号(默认8080):
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
主机名称(默认:localhost->127.0.0.1):
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
lib:库目录,包含依赖的jar包
logs:日志文件
webapps:默认的Web应用部署目录
网站是如何进行访问的
1.输入一个域名,回车
2.检查本机的C:\Windows\System32\drivers\etc\hosts配置文件下有没有这个域名映射;
将自己写的网站,放到服务器(Tomcat)中指定的web文件夹(webapps)下,就可以访问了
网站该有的结构:
-- webapps:Tomcat的web目录
-Root
-Jaystudy:网站目录名
-WEB-INF
-classes:Java程序
-lib:web应用依赖的jar包
-web.xml:网站配置文件
-index.html:默认首页
-css、js
- img
...
javaweb开发需要大量的jar包,需要手动导入
Maven:自动导入和配置jar包。
Maven核心思想:约定大于配置
由于这部分篇幅较大,另写一篇专搞配置:
Maven的安装与配置
在IDEA里配置Maven
①:servlet容器会创建一个封装了HTTP请求的ServletRequest实例传递给servlet的service方法
②:ServletResponse则表示一个Servlet响应,其隐藏了将响应发给浏览器的复杂性
③:通过ServletRequest的方法你可以获取一些请求相关的参数,而ServletResponse则可以将设置一些返回参数信息,并且设置返回内容。
1.首先浏览器通过ip:port连接服务器,这时浏览器将请求的数据按照HTTP协议的标准封装成了一个数据包并发送给了服务器(TCP三次握手)。
2.服务器(Tomcat)创建两个对象:请求对象和响应对象,服务器在解析请求数据包后会将请求的数据放到请求对象中去,方便我们在servlet中使用。(注意:Servlet不会解析请求,这一步交给容器来做的。)这里的请求和响应的对象实际上就是HttpServletRequest和HttpServletResponse接口所对应的实现类。
3.根据请求的资源路径找到相应的servlet配置,通过反射创建一个servlet的实例,并调用service()方法,并将之前创建好的请求和响应的对象作为参数传递给service方法。
4.在servlet中编写我们自己的业务逻辑,并通过response设置响应给浏览器的数据。(需要我们自己开发)
5.服务器从Response中获取到我们写的响应数据,把他们根据HTTP协议封装成一个数据包(响应的数据包)发送给浏览器,关闭连接(TCP四次挥手)
6.浏览器解析响应的数据包,取出数据,渲染页面。在整个的流程中我们只需要编写过程4中的servlet的业务逻辑,其他的都由Tomcat容器和浏览器封装。
Servlet由web服务器创建,Servlet方法由web服务器调用。
生命周期:一个对象从被创建到被销毁的整个过程。
Servlet运行在Servlet容器(web服务器,即Tomcat)中,其生命周期由容器来管理,分为四个阶段:
init()
方法初始化这个对象(加载配置文件、创建连接等)。该方法只调用一次service()
方法对请求进行处理destroy()
方法完成资源的释放,该实例随后会被Java的垃圾收集器所回收getServletInfo()
:获取Service信息getServletConfig()
:获取ServletCOnfig对象
将来开发B/S架构的web项目,都是针对HTTP协议,所以我们定义Servlet,会继承HttpServlet
,重写里面的方法:
HttpServlet中为什么要根据请求方式的不同,调用不同方法?
如何调用?
需要根据请求方式的不同,进行分别的处理
HttpServletRequest request = (HttpServletRequest) req;
String method = req.getMethod();
if("GEt".equals(method)){
//get方式的处理逻辑
}else if("POST".equals(method)){
//post方式的处理逻辑
}
Servlet要想被访问,必须配置其访问路径(URLPattern
)
一个Servlet,可以配置多个URLPattern
@WebServlet(urlPatterns = {"/demo1","/demo2"})
urlPattern配置规则:
①精确匹配
@WebServlet("/user/select")
②目录匹配
@WebServlet("/user/*")
③扩展名匹配
@WebServlet("*.do")
④任意匹配
@WebServlet("/")
或者@WebServlet("/*")
配置了“/”意味着匹配任意访问路径
优先级:精确路径–>目录路径–>扩展名路径–>/*–>/
Servlet从3.0后才支持注解方法,之前都是通过xml方式来配置访问路径
mapping映射:用于指定URL映射路径:
name和name对应,class指定项目中该Servlet路径,url-pattern指定浏览器访问路径
<servlet>
<servlet-name>helloServletservlet-name>
<servlet-class>cn.jay.servlet.HelloServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>helloServletservlet-name>
<url-pattern>/hellourl-pattern>
servlet-mapping>
可以映射多个路径:创建多个mapping标签嵌套多个
路径
通配符:* 可以指定通用映射路径
优先级:固有的映射路径优先级最高,如果找不到就会走默认的处理请求;
GET /request-demo/req1?username=jay&password=123 HTTP/1.1
String getMethod();//获取请求方式
String getContextPath();//获取虚拟目录(项目访问路径):/request-demo
StringBuffer getRequestURL();//获取URL(统一资源定位符):http://localhost:8080/request-demo/req1
String getRequestURI();//获取URI(统一资源标识符):/request-demo/req1
String getQueryString();//获取请求参数(get方式):username=jay&password=123
user-agent: Mozilla/5.0 Chrome/101.0.495
String getHeader(String name);//根据请求头名称,获取值(例如user-agent获取浏览器版本信息)
username=jay&password=123
(post方式)ServletInputStream getInputStream();//获取字节输入流
BufferedReader getReader();//获取字符输入流
获取post 请求体:请求参数
//1.获取字符输入流
BufferedReader br = req.getReader();
//2.读取数据
String l = br.readLine();
System.out.println(l);
由上可知请求参数获取方式有
String getQueryString()
BufferredReader getReader()
通用方式获取请求参数:
Map<String, String[]> getParameterMap();//获取所以参数map集合
String[] getParameterValues(String name);//根据名称获取参数值
String getParameter(String name);//根据名称获取单个参数
post方式:设置输入流的编码req.setCharacterEncoding("utf-8");
get方式:
String s = URLEncoder.encode("utf-8");
System.out.println(s);
中文应该:String encode = URLEncoder.encode("utf-8");
而tomcat:String encode = URLEncoder.encode("ISO-8859-1");
所以出现报错,就是因为编码格式不匹配
byte[] bytes = decode.getBytes("ISO-8859-1");
可以通过for打印每个字节:
for (byte b : bytes){
System.out.println(b+" ");
}
String s = new String(bytes, "utf-8");
通用方式解决乱码问题:
username = new String(username.getBytes(standCharsets.ISO_8859_1), StandardCharsets.UTF_8);
实现方式:
req.getRequestDispatcher("资源B路径").forward(req,resp);
请求转发资源间共享数据:使用Request对象
void setAttribute(String name,Object o);//存储对象到request域中
Object getAttribute(String name);//根据key获取值
void removeAttribute(String name);//根据key删除该键值对
请求转发特点:
响应数据分为三部分:
重定向(Redirect):一种资源跳转方式 ,把资源跳转到另一个页面
状态码:302
设置响应状态码302
response.setStatus(302);
设置响应头Location
response.setHeader(“Location”,“/request-demo/resp2”);
简化方式完成重定向:
response.sendRedirect(“Location”,"/request-demo/resp2");
重定向的特点:
路径问题:
浏览器使用:需要加虚拟目录(项目访问路径),例如
等从浏览器发出请求的
服务端使用:不需要加虚拟目录,例如req.getRequestDispatcher(“路径”)
等从服务器发出请求的
JSP(JavaServer Pages,Java服务页面)
由于JSP技术几乎过时,因此另开一篇博文简单介绍。