在昨天呢,我已经把Javase的全部内容更新完了。
今天来点猛的。javaweb一天更完。
javaWeb
1 基本概念
1.1 web的分类
静态web网站:
数据不会发生改变,对任何用户都一样,无法使用户数据持久化
使用的技术:html, css,javaScript
动态web网站:
数据会根据用户的不同而不同,可持久化数据
使用技术:Jsp/Servelt html ,css,javaScript
1.2、 web应用流程图
1.3、了解软件的步骤
- 解压安装
- 了解软件的目录结构和配置文件
- 了解基础使用步骤
2、Tomcat
2.1 下载安装
下载网址:https://tomcat.apache.org/download-10.cgi
2.2 配置Tomcat和了解目录结构
目录结构的情况
服务器配置文件
server.xml详解
端口配置:
默认端口是 8080
connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>123
域名配置和请求资源路径
默认域名是 locahost === 127.0.0.1
默认资源文件是 webapps
可以通过C:\Windows\System32\drivers\etc的hots文件重新配置本地的域名 可将127.0.0.1 的对应得域名改成任意域名
unpackWARs="true" autoDeploy="true">12
2.3 启动关闭服务器
2.4 如何网站的IP地址如何获取
2.5发布web网站的流程
1.在Tomcat的webapps文件中新建一个文件夹作为文件目录
文件java的目录详情
webapps :
---- 项目名(文件夹名):
---- WEI-INF
----web.xml web应用程序的配置文件
-----classes servlet
----- lib 链接的jar包
---- pages 请求的页面 jsp,htm
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1mfkXrcT-1595228459618)(javaWeb(1)].assets/1594300116028.png)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CGYowNYh-1595228459619)(javaWeb(1)].assets/1594300134321.png)
2.编写配置文件web.xml
characterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 characterEncodingFilter /* 1234567891011121314
3.编写页面(默认请求页面时index页面)
4.启动服务器,访问 locahost:8080/项目名
3.HTTP 协议
基础概念
超文本传输协议,建立在TCP/ip协议之上
特点:一次请求,一次响应,无状态
Http协议有两个版本:
http1.0
http1.1 === https 更加安全
深入分析
请求行:
Request URL: https://www.baidu.com/Request 请求的域名
Request Method: GET
Status Code: 200 OK
Remote Address: 14.215.177.39:443 请求域名对应的ip地址
Referrer Policy: no-referrer-when-downgrade 当https协议降级为http协议时,不发送referrer信息
Request Method 是请求方法 常用请求方法有POST,DELETE,PUT,GET(对应数据库的增删改查)
Status Code: 请求的结果大致分类
- 2XX 请求成功
- 3XX 重定向(跳转到另一个页面)
- 4XX 找不到资源
- 5XX 服务器出错
请求头:
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9 接受的文件类型
Accept-Encoding: gzip, deflate, br 接受的文件编码格式
Accept-Language: zh-CN,zh;q=0.9 接收的语言类型
Cookie: 存放服务器辨识用户身份证明的空间
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 浏览器的标识
响应头:
Cache-Control: private 缓存控制
Content-Type: text/html;charset=utf-8 响应体的文件格式和编码
Expires: Sun, 12 Jul 2020 07:08:50 GMT 响应资源时间
4.Maven
基础知识
下载管理jar包的工具
1.maven下载jar包的流程图
Maven的安装
1.从官网下载安装maven,在本地解压
2.了解目录结构
3.win10配置系统环境变量
M2_HOME 路径:maven的安装目录下的bin目录
MAVEN_HOME maven的安装目录
在系统的path中配置%MAVEN_HOME%\bin
4.测试在cmd中输入mvn -version,出现下图成功
5.配置阿里云镜像
打开maven目录下的conf目录编辑settings.xml文件
在(注意是有加s的标签)中添加
nexus-aliyun *,!jeecg,!jeecg-snapshots Nexus aliyun http://maven.aliyun.com/nexus/content/groups/public1234567
- 设置本地仓库
找到settings.xml中的 localRepository 标签改为你想存放jar的目录,具体格式如下
D:\Environment\apache-maven-3.6.2\maven-repo12
IDEA 与Maven
两篇博文搞定
idea的配置
idea配置启动maven项目
5. Servlet
基础知识
Servlet是一个接口,用于java的web 开发,供服务器调用的应用服务
Servlet的继承结构:
GeenericServlet只实现部分接口
HtppServlet 实现完整的接口。其核心的方法是service(HttpServletRequest req, HttpServletResponse resp)负责将不同请求方法发放到不同的方法中
一般情况下我们做的基础的业务就是继承HttpServelt 然后重写它请求方法(通常是get和post方法)
下图是我思考的关于处理请求的流程,未必准确
servlet生命周期:
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
- Servlet 通过调用 init () 方法进行初始化。
- Servlet 调用 service() 方法来处理客户端的请求。
- Servlet 通过调用 destroy() 方法终止(结束)。
- 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
实践入门 helloServlet
基本所有web项目的编写都遵循此流程
1.新建maven项目,配置pom.xml,导入项目需要的jar包
javax.servlet javax.servlet-api 4.0.1 123456789101112
- 编写业务代码
public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().print("
Hello Servlet
");
} @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); }}1234567891011
3.配置weapp下的WEB-INF目录下的web.xml文件
/span> "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > Archetype Created Web Application demo-01 cn.codeancat.servlet.HelloServlet demo-01 /hello 12345678910111213141516171819
- 配置Tomcat打包,运行结果
web.xml中Mapping配置问题
demo-01 /* demo-01 /hello/* error /hello/error hello *.qinjiang 123456789101112131415161718192021222324252627282930
servletContext
servlet的上下文,用于使两个servelt可以进行数据交互
ServletContext在整个会话就是用户打开浏览器到关闭浏览器的过程只有一个。属于单例对象
下列是交互流程示意图
.png)
案例演示:
1,数据共享
SetServletContext类存放数据
ServletContext servletContext =this.getServletContext(); String name="赵泽桦"; servletContext.setAttribute("name",name);1234
GetServletContext 类获取数据
ServletContext servletContext =this.getServletContext(); String name =(String)servletContext.getAttribute("name"); resp.setContentType("text/html"); resp.setCharacterEncoding("utf8"); resp.getWriter().print("name:"+name);123456
2.同web.xml读取初始化参数
ServletContext servletContext =this.getServletContext();String name=servletContext.getInitParameter("username");resp.getWriter().print(name);1234
web.xml的配置
username root 123456
3.通过properties文件读取配置
ServletContext servletContext =this.getServletContext(); //路径为打包后的文件的路径 InputStream inputStream =servletContext.getResourceAsStream("WEB-INF/classes/db.properties"); Properties properties=new Properties(); properties.load(inputStream); String name=properties.getProperty("username"); String psw =properties.getProperty("password"); resp.getWriter().print(name+":"+psw);123456789
db.properties的位置
db.properties的文件内容
username=rootpassword=123456123
4.实现转发请求
ServletContext servletContext =this.getServletContext(); System.out.println("进入servletCoentext"); servletContext.getRequestDispatcher("/read").forward(req,resp);1234
HttpServeltResponse
基础概念
向前端返回数据的两种方式
PrintWriter getWriter() throws IOException;ServletOutputStream() getOutputStream;123
设置响应头的参数
void sendRedirect(String var1) throws IOException // 重定向,跳转连接void setContentType(String var1); //设置响应文件的格式void setCharacterEncoding(String var1); //设置响应文件的编码void setStatus(int var1); //设置响应的状态码void setHeader(String var1, String var2); //设置响应头void setDateHeader(String var1, long var2); //数据响应设置,多用于处理缓存1234567
响应的状态码
案例演示:
1.下载
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.文件位置 String path="C:\\Users\\zzh\\Desktop\\现在\\vue.js.xmind"; //2.设置文件名,注意编码格式 **** String fileName = path.substring(path.lastIndexOf("\\")+1); //3.获取文件的输入流 FileInputStream fileInputStream = new FileInputStream(path); //4.获取Response的输出流 OutputStream outputStream =resp.getOutputStream(); //5设置输出的文件格式和编码格式 **** resp.setHeader("Content-Disposition","atachment;filename="+ URLEncoder.encode(fileName,"utf-8")); //6.将输入流读入并输出到输出流 byte[] bytes = new byte[1024]; int len=0; while ((len=fileInputStream.read(bytes))>0){ outputStream.write(bytes,0,len); } //7.关闭输入输出流 outputStream.close(); fileInputStream.close(); }1234567891011121314151617181920212223
2.验证码
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.创建画布,设置画布的宽和高 BufferedImage bufferedImage = new BufferedImage(80,20,BufferedImage.TYPE_3BYTE_BGR); //2.获取画笔 Graphics2D graphics =(Graphics2D) bufferedImage.getGraphics(); //3.设置画笔颜色,填充画布颜色 graphics.setColor(Color.white); graphics.fillRect(0,0,80,20); //4.设置画笔颜色,字体 graphics.setColor(Color.blue); graphics.setFont(new Font(null,Font.BOLD,20)); //5.随机生成数字 ***** String randomNum =getRandomInt(); System.out.println(randomNum); //6.将生成的数字写入画布 graphics.drawString(randomNum,0,20); //7.设置响应头 //设置刷新时间 resp.setHeader("refresh","3"); //设置文件格式 resp.setContentType("image/jpeg"); //设置无缓存 resp.setDateHeader("expires",-1); resp.setHeader("Cache-Control","no-cache"); resp.setHeader("Pragma","no-cache"); //8.输出 **** ImageIO.write(bufferedImage,"jpg",resp.getOutputStream()); } private String getRandomInt(){ Random random = new Random(); String num = random.nextInt(9999999)+""; StringBuffer stringBuffer =new StringBuffer(); for(int start = 0; start < 7 -num.length(); start++){ stringBuffer.append(0); } return num+stringBuffer.toString(); }12345678910111213141516171819202122232425262728293031323334353637383940414243
3.重定向(常用于登录界面)
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("进入SendRedirectServlet"); resp.sendRedirect("/s3/captcha"); }1234567
HttpServletRequest
基础概念
HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器, HTTP请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息;
从获取数据的方式
Collection getParts() throws IOException, ServletException; // 将前端的表格拆分多个部分获取 String getParameter(String var1); //获取前端的传参,var的取值为前端的name属性 Object getAttribute(String var1); //从ServletContext中获取数据12345
案例演示
目录结构:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FogLs1gc-1595228459639)(javaWeb(1)].assets/1594612791730.png)
前端代码:
用户名: 密码: 1234567891011121314
后端代码:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String name =req.getParameter("username"); String password =req.getParameter("password"); System.out.println(name+" :" +password); resp.sendRedirect("/s4/success.jsp"); }12345678
6. 会话技术
基础概念
会话:从用户打开浏览器到关闭浏览器的过程
会话技术:用于确认用户的登录的状态
cookie
基础概念
cookie :
- 存放于浏览器的存储空间(会生成相关的文件)
2. 大小不超过4kb 3. 每个站点(域名)最多20个12
以键值对的方式存放数据
常用方法:
//maxAge生存时间 ,若为负数则一直存在,默认为-1
public void setMaxAge(int expiry) { this.maxAge = expiry;}public int getMaxAge() { return this.maxAge;}
// 获取键名
public String getName() { return this.name;}
//获取值
public void setValue(String newValue) { this.value = newValue;}public String getValue() { return this.value;}
演示案例
放置cookie
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); Cookie cookie = new Cookie("name", URLEncoder.encode("赵泽桦","utf8")); resp.addCookie(cookie); resp.sendRedirect("/getCookie"); // req.getRequestDispatcher("/getCookie").forward(req,resp);转发无法获取,因为转发是服务器的之间的servlet的交互 }123456789
获取cookie
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); req.setCharacterEncoding("utf-8"); PrintWriter writer = resp.getWriter(); Cookie[] cookies=req.getCookies(); for(int i = 0; i < cookies.length; i++){ if(cookies[i].getName().equals("name")) writer.write("
name:"+ URLDecoder.decode(cookies[i].getValue(),"utf8")+"
"); } }1234567891011121314
在浏览器查看cookie
杀死cookie
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); req.setCharacterEncoding("utf-8"); PrintWriter writer = resp.getWriter(); Cookie[] cookies=req.getCookies(); Cookie cookie =null; for(int i = 0; i < cookies.length; i++){ cookie =cookies[i]; if(cookie.getName().equals("name")){ cookie.setMaxAge(0); break; } } resp.addCookie(cookie); writer.write("
cookie被杀死
"); }12345678910111213141516171819
session(重点)
基础概念
- 存放于服务端,可用于登录,购物车,秒杀
- 以键值对方式存放
- 大小不做限制
cookie 与 session 的搭配使用 用户登录示意图
Session和cookie的区别:
- Cookie是把用户的数据写给用户的浏览器,浏览器保存 (可以保存多个)
- Session把用户的数据写到用户独占Session中,服务器端保存 (保存重要的信息,减少服务器资源的浪费)
- Session对象由服务创建;
常用方法:
long getCreationTime(); //创建时间 String getId(); //服务器识别不同浏览器的标识 long getLastAccessedTime(); //上次访问时间 ServletContext getServletContext(); //获取全局上下文 void setMaxInactiveInterval(int var1); //设置最大生存时间 int getMaxInactiveInterval(); void invalidate() //注销Session 12345678
演示案例
存放一个Session
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf8"); resp.setContentType("utf8"); HttpSession session =req.getSession(); Pepole pepole =new Pepole("赵泽桦","157zeye",15); session.setAttribute("pepole",pepole); resp.sendRedirect("/getSession"); }123456789101112
获取一个Session
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf8");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf8");
HttpSession session=req.getSession();
Pepole pepole=(Pepole) session.getAttribute("pepole");
PrintWriter writer = resp.getWriter();
writer.write("
"+pepole.toString()+"
");
}
1234567891011121314
注销Session
通过代码:
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
req.setCharacterEncoding("utf-8");
HttpSession session = req.getSession();
//移除某个键值对
session.removeAttribute("pepole");
//彻底杀死session
session.invalidate();
if(session.getId().length()<=0){
resp.getWriter().write("
Session被杀死
");
}
12345678910111213
通过web.xml配置
15
12345
7. JSP
本质上:就是一个Servelt,向tomcat 请求jsp时会将它自动编译
最重要的方法:
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException
123
jspService中内置对象
final javax.servlet.jsp.PageContext pageContext; //存储数据,只在本页面有效
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
123456
通过JspWriter 方法将一个标签或者变量,表达式输出成html页面
基础语法
<="输出文件或者html代码" >
12345
jsp指令
1234567
jsp常用内置对象
pageContext.setAttribute("name1","秦疆1号"); //保存的数据只在一个页面中有效
request.setAttribute("name2","秦疆2号"); //保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","秦疆3号"); //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","秦疆4号"); //保存的数据只在服务器中有效,从打开服务器到关闭服务器
123456
jstl
将jsp中脚本片段标签化,便于与html代码配合使用
EL表达式:${ }
获取数据执行运算获取web开发的常用对象JSP标签
http://localhost:8080/jsptag.jsp?name=kuangshen&age=12
--%>
123456789101112
JSTL表达式
JSTL标签库的使用就是为了弥补HTML标签的不足;它自定义许多标签,可以供我们使用,标签的功能和Java代码一样!
格式化标签
SQL标签
XML 标签
核心标签 (掌握部分)
JSTL标签库使用步骤
引入对应的 taglib使用其中的方法在Tomcat 也需要引入 jstl的包,否则会报错:JSTL解析错误
8. javaBeen
1.所有成员变量私有化
2.所有成员变量都对应的get,set方法
3.public的构造函数
用于与数据库的字段做一一映射关系,保存从数据库取出的数据
9.MVC架构示意图
10.Filter(过滤器 重点)
作用:屏蔽一些非法请求
实现的流程:
- 实现Filter接口,重写init() ,doFilter(),destroy(),一般只重写doFilter()就可以
- init() 是服务器启动时执行的方法,destroy()服务器关闭时执行,doFilter是有请求时执行
doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
/*servletReques 可以强转成HttpServletReques ,servletResponse也一样
*filterChain中的dofilter(HttpServletReques req,HttpServletResponse resp)
*是放行请求,如果不执行该方法就请求就无法到达对应的servlet
*/
123456
- 配置web.xml 具体配置基本与servlet相同
案例演示
判断用户是否登录案例流程图:
文件结构目录:
过滤器PrivienterFilter代码:
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest) servletRequest;
HttpServletResponse response=(HttpServletResponse) servletResponse;
HttpSession session=request.getSession();
User user=(User) session.getAttribute("user");
if(user==null){
response.sendRedirect("/login.jsp");
}else {
filterChain.doFilter(request,response);
}
}
1234567891011121314
SetDefaultNameServlet登录
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
User user =new User(1,"赵泽桦","zzh");
HttpSession session=req.getSession();
session.setAttribute("user",user);
req.getRequestDispatcher("/sys/user.jsp").forward(req,resp);
}
123456789
login.jsp
Title登录