JavaWeb
1,基本概念
1.1 前言
web开发:
-
web,网页的意思, www.baidu.com·
-
静态web
- html, csS
- 提供给所有人看的数据始终不会发生变化!
-
动态web
- 淘宝,几乎是所有的网站;
- 提供给所有人看的数据始终会发生变化,每个人在不同的时间,不同的地点看到的信息各不相同!
- 技术栈: Servlet/lSP,ASP,PHP
在Java中,动态web资源开发的技术统称为lavaWeb;
1,服务器指一个管理资源并为用户提供服务的计算机软件,通常分为文件服务器、数据库服务器和应用程序服务器。
2、严格来说,服务器本身就是计算机硬件,并在其中运行的管理软件的一种管理资源,就如同电脑。按硬件还会分塔式服务器,卡片机,小型机。是一个大的概念,任何一台电脑安装了软件的服务器端就可以叫服务器。
专业服务器需要**专业的硬件和软件支持,**性能高,价格也比较高。服务器有多种,比如有游戏服务器,web服务器,文件服务器,数据库服务器,邮件服务器,网站服务器等等很多种类。找个专业IDC商锐讯网络也是很重要的。
1.2 web应用程序
web应用程序:可以提供浏览器访问的程序;
-
a.html、b.htm…多个web资源,这些web资源可以被外界访问,对外界提供服务;。
-
你们能访问到的任何一个页面或者资源,都存在于这个世界的某一个角落的计算机上。.
-
URL
-
这个统一的web资源会被放在同一个文件夹下,web应用程序–>Tomcat:服务器。
-
一个web应用由多部分组成(静态web,动态web)
- html,css,is
- isp,servleto Java程序
- jar包
- 配置文件(Properties)
web应用程序编写完毕后,若想提供给外界访问:需要一个服务器来统一管理;
1.3、静态web
-
.htm,.html,这些都是网页的后缀,如果服务器上一直存在这些东西,
我们就可以直接进行读取。通络; -
静态web存在的缺点
- Web页面无法动态更新,所有用户看到都是同一个页面
- 轮播图,点击特效:伪动态
- JavaScript [实际开发中,它用的最多]
- vBScript
- Web页面无法动态更新,所有用户看到都是同一个页面
-
它无法和数据库交互(数据无法持久化,用户无法交互)
1.4、动态web
页面会动态展示:“Web的页面展示的效果因人而异”;
缺点:
- 加入服务器的动态web资源出现了错误,我们需要重新编写我们的后台程序,重新发布;
- 停机维护
优点:
- Web页面可以动态更新,所有用户看到都不是同一个页面
- 它可以与数据库交互(数据持久化)
2.web服务器
2.1技术讲解
ASP:
- 微软:国内最早流行的就是ASP;
- 在HTML中嵌入了VB的脚本,ASP + COM;
- 在ASP开发中,基本一个页面都有几千行的业务代码,页面极其换乱·
- 维护成本高!
php:
- PHP开发速度很快 ,功能很强大,跨平台,代码很简单(70%, WP)·
- 无法承载大访问量的情况(局限性)
JSP/Servlet:
B/S:浏览和服务器
C/S:客户端和服务器
-
sun公司主推的B/S架构
-
基于Java语言的(所有的大公司,或者一些开源的组件,都是用ava写的)·
-
可以承载三高问题带来的影响;(高并发,高可以,高性能)
-
语法像ASP,ASP–>ISP,加强市场强度;
2.2、web服务器
服务器是一种被动的操作,用来处理用户的一些请求和给用户一些响应信息;
uls
微软的;ASP…,Windows中自带的
Tomcat
面向百度编程;
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,最新的
Serlet和SP规范总是能在Tomcat中得到体现,因为Tomcat技术先进、性能稳定,而且免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web应用服务器。
Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试L$程序的首选。对于一个Java初学web的人来说,它是最佳的选择
Tomcat实际上运行ISP页面和Servlet。另外,Tomcat和IS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和SP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。国前Tomcat最新版本为9.0。
高难度面试题:
请你谈谈网站是如何进行访问的!
1.输入一个域名;回车
⒉检查本机的C:\Windows\System32\driversletclhosts配置文件下有没有这个域名映射;
1.有:直接返回对应的ip地址,这个地址中,有我们需要访问的web程序,可以直接访问
127.0.0.1 www.blplovehj.com
2.没有:去DNS服务器找,找到的话就返回,找不到就返回找不到;
3、Http
3.1、什么是HTTP
HTTP(超文本传输协议):是一个简单的请求-响应协议,它通常运行在TCP之上。
- 文本: html,字符串,~……
- 超文本:图片,音乐,视频,定位,地图…
- 80
Https:安全的.
- 443
3.2、两个时代
-
http1.0
- HTTP/1.0:客户端可以与web服务器连接后,只能获得一个web资源,断开连接-
-
http2.0
- HTTP/1.1:客户端可以与web服务器连接后,可以获得多个web资源。
3.3Http请求
1、请求行
-
请求行中的请求方式: GET
-
请求方式:Get,Post,HEAD,DELETE,PUT,TRACT…
-
get:请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示数据内容,不安全,但高效
-
post:请求能够携带的参数没有限制,大小没有限制 ,不会在浏览器的URL地址栏显示数据内容,安全,但不高效。
-
2、消息头
1 Accept:告诉浏览器,它所支持的数据类型
2Accept-Encoding:支持哪种编码格式GBK UTF-8GB2312 Iso8859-1
3Accept-Language:告诉浏览器,它的语言环境
4cache-contro1:缓存控制
5connection:告诉浏览器,请求完成是断开还是保持连接
6HOST:主机
3.4Http响应
1.响应体
1 Accept:告诉浏览器,它所支持的数据类型
2Accept-Encoding:支持哪种编码格式GBK UTF-8GB2312 IS08859-13Accept-Language:告诉浏览器,它的语言环境
4cache-contro1:缓存控制
5 connection:告诉浏览器,请求完成是断开还是保持连接6HOST:主机..../ .
7 Refresh:告诉客户端,多久刷新一次;
8Location:让网页重新定位;
2、响应状态码
200:请求响应成功200
3xx:请求重定向
- 重定向:你重新到我给你新位置去;
4xx:找不到资源 404
- 资源不存在;
5xx:服务器代码错误 500 502:网关错误
常见面试题:
当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示回来,经历了什么?
3.5 maven
resources 资源放在该目录下(约定大于配置,这关系到数据的调用 eg:properties配置文件)
4、Servlet
4.1,Servlet简介
- Servlet就是sun公司开发动态web的一门技术
- sun在这些API中提供一个接口叫做: Servlet,如果你想开发一个Servlet程序,只需要完成
- 两个小步骤:
- 编写一个类,实现Servlet接口
- 把开发好的Java类部署到web服务器中。把实现了Servlet接口的Java程序叫做,Servlet程序
4.2,HelloServlet
1.构建一个普通的Maven项目,删掉里面的src目录,以后我们的学习就在这个项目里面建立Moudel;这个空的工程就是Maven主工程;
-
创建Maven项目后看配置是否是我们所要的路径
file->Settings->
2.在pom.xml里导入servlet jar包
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
3.关于Maven父子工程的理解:
父项目中会有
<modules>
<module>servlet01</module>
</modules>
子项目:
<parent>
<artifactId>blp-01-javaweb</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
父项目中的java子项目关系
son extends father
4.Maven环境优化
1.修改web.xml为最新的
路径:D:\tomcat\apache-tomcat-9.0.58\webapps\ROOT\WEB-INF
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
</web-app>
将maven的结构搭建完整
java和resources包
5.编写一个Servlet程序
1.编写一个普通类
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();//响应流
writer.print("ghjk");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2.实现Servlet接口,这里我们直接继承HttpServlet
6.编写Servlet的映射在web.xml里
为什么需要映射:我们写的是JAVA程序,但是要通过浏览器访问,而浏览器需要连接web服务
器,所以我们需要再web服务中注册我们写的Servlet,还需给他一个浏览器能够访问的路径
<!--注册servlet-->
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>com.blp.Hello.HelloServlet</servlet-class>
</servlet>
<!--servlet的请求路径-->
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/Hello</url-pattern>//注意/斜杠,不然会出现问题,见CSDN收藏
</servlet-mapping>
7.配置tomcat
8.启动
4.3 Servlet原理
Servlet是由Web服务器调用,web服务器在收到浏览器请求之后,会:
4.4、Mapping问题
1.—个Servlet可以指定一个映射路径
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/default</url-pattern>
</servlet-mapping>
2.一个Servlet可以指定多个映射路径
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/default</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/v</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/b</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/c</url-pattern>
</servlet-mapping>
3.一个Servlet可以指定通用映射路径
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/default/*</url-pattern>
</servlet-mapping>
4.指定一些后缀或者前缀等等…
< !--可以自定义后缀实现清求映射注意点。*前面不能加项目映射的路径"/''-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.blp</url-pattern>
</servlet-mapping>
5.默认请求路径(一般不用)
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
6.优先级问题
指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求;
<!--404-->
<servlet>
<servlet-name>error</servlet-name>
<servlet-class>com.kuang.servlet.Errorservlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>error</servlet-name>
<ur1-pattern>/*</ur1-pattern>
</ servlet-mapping>
4.5、ServletContext
web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用;
-
共享数据
我在这个Servlet中保存的数据,可以在另外一个servlet中拿到;eg:A要复制B,前提是B要在A前面访问
- 获取初始化参数
<!--配置一些web应用初始化参数-->
<context-param>
<param-name>ur1</param-name>
<param-value>jdbc:mysq1://loca7host:3306/mybatis</param-value>
</context-param>
protected void docet(HttpservletRequest req,HttpservletResponse resp)throws servletException, IOException {
servletcontext context = this.getservletcontext(;
string ur1 =context.getInitParameter("ur1");
resp. getwriter(.print(ur1);
- 4、读取资源文件Properties
- 在java目录下新建properties。
- 在resources目录下新建properties
发现:都被打包到了同一个路径下: classes,我们俗称这个路径为classpath:
思路:需要一个文件流
db.properties
username=root
password=1234567890blp
public class servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream asStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");//将该web路径下的db.properties转化为流
Properties properties = new Properties();
properties.load(asStream);//获取db.properties流里的数据
String username = properties.getProperty("username");
String password = properties.getProperty("password");
resp.getWriter().print(username+":"+password);
asStream.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
4.6、HttpServletResponse
web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse;
- 如果要获取客户端请求过来的参数:找HttpServletRequest·
- 如果要给客户端响应一些信息:找HttpServletResponse1、简单分类
负责向浏览器发送数据的方法
- servletoutputstream getoutputstream( throws IOException);
- Printwriter getwriter( throws IOException);
常见应用
1.向浏览器输出消息(一直在讲,就不说了)
2.下载文件
1.要获取下载文件的路径
2.下载的文件名是啥?
3.设置想办法让浏览器能够支持下载我们需要的东西
4.获取下载文件的输入流
5.创建缓冲区
6.获取OutputStream对象
7.将FileOutputStream流写入到buffer缓冲区
8.使用OutputStream将缓冲区中的数据输出到客户端!
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1.要获取下载文件的路径
String realPath="D:\\java代码\\javaweb\\blp-02-javaweb\\response-0\\src\\main\\resources\\b.png";
// 2.下载的文件名是啥?
String substring = realPath.substring(realPath.indexOf("\\") + 1);
// 3.设置想办法让浏览器能够支持下载我们需要的东西
resp.setHeader("Content-Disposition", "attachment;filename="+substring);
// 4.获取下载文件的输入流
FileInputStream inputStream = new FileInputStream(realPath);
// 6.获取OutputStream对象
// 7.将FileOutputStream流写入到buffer缓冲区
// 8.使用OutputStream将缓冲区中的数据输出到客户端!
ServletOutputStream outputStream = resp.getOutputStream();
int len=0;
byte[] buffer = new byte[1024];
while ((len=inputStream.read(buffer))!=-1){
outputStream.write(buffer,0,len);
}
outputStream.close();
inputStream.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
3.实现验证码
4.7 重定向
B一个web资源收到客户端A请求后,B他会通知A客户端去访问另外一个web资源C,这个过程叫重定向
常见场景:
- 用户登录
面试题:请你聊聊重定向和转发的区别?
相同点
- 页面都会实现跳转
不同点
- 请求转发的时候,url不会产生变化 307
- 重定向时候,url地址栏会发生 302
<input type="submit" /> 定义为一个提交按钮。提交按钮会把表单数据发送到服务器。
4.8 HttpServletRequest
HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息
<html>
<body>
<h2>Hello World!</h2>
<!--${pageContext.request.contextPath}代表当前的项目--!>
<%@ page pageEncoding="UTF-8"%>
<form action="${pageContext.request.contextPath}/res" method="get">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit">
</form>
</body>
</html>
public class response extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int child=0;
String s = req.getParameter("username");
String p = req.getParameter("password");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
if(s.equals("root")){
child++;
}
else resp.getWriter().print("用户名错误\t");
if (p.equals("1234567890blp"))
{child++;}
else resp.getWriter().print("密码错误\t");
resp.getWriter().print(child);
if(child==2){
//请求转发
//这里的 / 代表web应用
req.getRequestDispatcher("/UserName").forward(req,resp);
//重定向 resp.sendRedirect("/ResponseServlet_war/UserName");
}else resp.getWriter().print("<h1>404</h1>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
5、Cookie、Session
5.1、会话
-
会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话;
-
有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学,曾经来过,称之为有状态会话;
你能怎么证明你是西开的学生?
你 西开
发票 西开给你发票
学校登记 西开标记你来过了
一个网站,怎么证明你来过?
客户端 服务端
- 服务端给客户端一个 信件,客户端下次访问服务端带上信件就可以了; cookie
- 服务器登记你来过了,下次你来的时候我来匹配你; seesion
5.2、保存会话的两种技术
-
cookie(饼干)
- 客户端技术 (响应,请求)
-
session(会议)
- 服务器技术,利用这个技术,可以保存用户的会话信息? 我们可以把信息或者数据放在Session中!
常见:网站登录之后,你下次不用再登录了,第二次访问直接就上去了!
5.3、Cookie
- 从请求中拿到cookie信息
- 服务器响应给客户端cookie
Cookie[] cookies = req.getCookies(); //获得Cookie
cookie.getName(); //获得cookie中的key
cookie.getValue(); //获得cookie中的vlaue
new Cookie("lastLoginTime", System.currentTimeMillis()+""); //新建一个cookie
cookie.setMaxAge(24*60*60); //设置cookie的有效期
resp.addCookie(cookie); //响应给客户端一个cookie
cookie:一般会保存在本地的 用户目录下 appdata;
-
一个网站cookie是否存在上限!聊聊细节问题
-
一个Cookie只能保存一个信息;
-
一个web站点可以给浏览器发送多个cookie,最多存放20个cookie;
-
Cookie大小有限制4kb;
-
300个cookie浏览器上限
删除Cookie;
-
不设置有效期,关闭浏览器,自动失效;
-
设置有效期时间为 0 ;
编码解码:
URLEncoder.encode("秦疆","utf-8")
URLDecoder.decode(cookie.getValue(),"UTF-8")
5.4、Session(重点)
什么是Session:
- 服务器会给每一个用户(浏览器)创建一个Seesion对象;
- 一个Seesion独占一个浏览器,只要浏览器没有关闭,这个Session就存在;
- 用户登录之后,整个网站它都可以访问!–> 保存用户的信息;保存购物车的信息……
…
…
…
Session和cookie的区别:
- Cookie是把用户的数据写给用户的浏览器,浏览器(客户端)保存 (可以保存多个)
- Session把用户的数据写到用户独占Session中,服务器端保存 (保存重要的信息,减少服务器资源的浪费)
- Session对象由服务创建;
Session和cookie的联系:
- SessionID存放在会话cookie中,随着进程消失SessionID也随之消失
- 用户登入淘宝网站时,用户的各种信息,包括用户名,密码,购物车等作为对象存入Session中,同时会生成唯一的SessionID存放在会话cookie中,用户访问淘宝的其他页面时为何不用再次登入?这是因为每次用户访问淘宝的其他页面时,都会携带会话cookie。当用户退出浏览器时该SessionID消失,但Session还会存放在服务器中一段时间,一段时间后自动消失。但为什么有时候我们关闭了浏览器进入淘宝页面还是显示已经登入?这是因为浏览器自动记录用户名和密码。
使用场景:
- 保存一个登录用户的信息;
- 购物车信息;
- 在整个网站中经常会使用的数据,我们将它保存在Session中;
使用Session:
package com.kuang.servlet;
import com.kuang.pojo.Person;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
public class SessionDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
//得到Session
HttpSession session = req.getSession();
//给Session中存东西
session.setAttribute("name",new Person("秦疆",1));
//获取Session的ID
String sessionId = session.getId();
//判断Session是不是新创建
if (session.isNew()){
resp.getWriter().write("session创建成功,ID:"+sessionId);
}else {
resp.getWriter().write("session以及在服务器中存在了,ID:"+sessionId);
}
//Session创建的时候做了什么事情;
// Cookie cookie = new Cookie("JSESSIONID",sessionId);
// resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
//得到Session
HttpSession session = req.getSession();
Person person = (Person) session.getAttribute("name");
System.out.println(person.toString());
HttpSession session = req.getSession();
session.removeAttribute("name");
//手动注销Session
session.invalidate();
会话自动过期:web.xml配置
<!--设置Session默认的失效时间-->
<session-config>
<!--15分钟后Session自动失效,以分钟为单位-->
<session-timeout>15</session-timeout>
</session-config>