JavaWeb

175 阅读6分钟

基本概念

web开发:

web,网页的意思 , www.baidu.com

静态web

html,css

提供给所有人看的数据始终不会发生变化!

动态web

淘宝,几乎是所有的网站;

提供给所有人看的数据始终会发生变化,每个人在不同的时间,不同的地点看到的信息各不相

同!

技术栈:Servlet/JSP,ASP,PHP

在Java中,动态web资源开发的技术统称为JavaWeb; 

web应用程序

web应用程序:可以提供浏览器访问的程序;

a.html、b.html......多个web资源,这些web资源可以被外界访问,对外界提供服务;

你们能访问到的任何一个页面或者资源,都存在于这个世界的某一个角落的计算机上。

URL

这个统一的web资源会被放在同一个文件夹下,web应用程序-->Tomcat:服务器

一个web应用由多部分组成 (静态web,动态web)

html,css,js

jsp,servlet

Java程序

jar包

配置文件 (Properties)

web应用程序编写完毕后,若想提供给外界访问:需要一个服务器来统一管理;

静态web

*.htm, *.html,这些都是网页的后缀,如果服务器上一直存在这些东西,我们就可以直接进行读

取。通络;

静态web存在的缺点

Web页面无法动态更新,所有用户看到都是同一个页面

轮播图,点击特效:伪动态

JavaScript [实际开发中,它用的最多]

VBScript

它无法和数据库交互(数据无法持久化,用户无法交互) 

动态web 

页面会动态展示: “Web的页面展示的效果因人而异”;

缺点:

加入服务器的动态web资源出现了错误,我们需要重新编写我们的后台程序,重新发布;

停机维护

优点:

Web页面可以动态更新,所有用户看到都不是同一个页面

它可以与数据库交互 (数据持久化:注册,商品信息,用户信息........)

ASP

微软:国内最早流行的就是ASP;

在HTML中嵌入了VB的脚本, ASP + COM;

在ASP开发中,基本一个页面都有几千行的业务代码,页面极其换乱

维护成本高!

C#

IIS

<h1><h1><h1> <h1><h1><h1> <h1><%System.out.println("hello") %><h1><h1> <h1><h1> <h1> 

php

PHP开发速度很快,功能很强大,跨平台,代码很简单 (70% , WP)

无法承载大访问量的情况(局限性)

JSP/Servlet   

B/S:浏览和服务器

C/S: 客户端和服务器

sun公司主推的B/S架构

基于Java语言的 (所有的大公司,或者一些开源的组件,都是用Java写的)

可以承载三高问题带来的影响;

语法像ASP , ASP-->JSP , 加强市场强度; 

什么是HTTP

HTTP(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上。

文本:html,字符串,~ ….

超文本:图片,音乐,视频,定位,地图…….

80

Https:安全的

443 

http1.0

HTTP/1.0:客户端可以与web服务器连接后,只能获得一个web资源,断开连接

http2.0

HTTP/1.1:客户端可以与web服务器连接后,可以获得多个web资源。‘ 

Http请求 

客户端---发请求(Request)---服务器 

请求行

请求行中的请求方式:GET

请求方式:Get,Post,HEAD,DELETE,PUT,TRACT…

get:请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示数据内容,不

安全,但高效

post:请求能够携带的参数没有限制,大小没有限制,不会在浏览器的URL地址栏显示数据内

容,安全,但不高效。 

消息头 

Accept:告诉浏览器,它所支持的数据类型 Accept-Encoding:支持哪种编码格式 GBK UTF-8 GB2312 ISO8859-1 Accept-Language:告诉浏览器,它的语言环境 Cache-Control:缓存控制 Connection:告诉浏览器,请求完成是断开还是保持连接 HOST:主机..../. 

Http响应 

服务器---响应-----客户端

响应体

Accept:告诉浏览器,它所支持的数据类型 Accept-Encoding:支持哪种编码格式 GBK UTF-8 GB2312 ISO8859-1 Accept-Language:告诉浏览器,它的语言环境 Cache-Control:缓存控制 Connection:告诉浏览器,请求完成是断开还是保持连接 HOST:主机..../. Refresh:告诉客户端,多久刷新一次; Location:让网页重新定位; 

响应状态码

200:请求响应成功 200

3xx:请求重定向

重定向:你重新到我给你新位置去;

4xx:找不到资源 404

资源不存在;

5xx:服务器代码错误 500 502:网关错误

Servlet简介

Servlet就是sun公司开发动态web的一门技术

Sun在这些API中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤:

编写一个类,实现Servlet接口

把开发好的Java类部署到web服务器中。 

把实现了Servlet接口的Java程序叫做,Servlet 

public class HelloServlet extends HttpServlet { //由于get或者post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //ServletOutputStream outputStream = resp.getOutputStream(); PrintWriter writer = resp.getWriter(); //响应流 writer.print("Hello,Serlvet"); }@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } } 

ServletContext

web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用;

下载文件 

1. 要获取下载文件的路径

2. 下载的文件名是啥?

3. 设置想办法让浏览器能够支持下载我们需要的东西

4. 获取下载文件的输入流

5. 创建缓冲区

6. 获取OutputStream对象

7. 将FileOutputStream流写入到buffffer缓冲区

8. 使用OutputStream将缓冲区中的数据输出到客户端!

@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1. 要获取下载文件的路径 String realPath = "F:\\班级管理\\西开【19525】\\2、代码\\JavaWeb\\javaweb- 02-servlet\\response\\target\\classes\\秦疆.png"; System.out.println("下载文件的路径:"+realPath); // 2. 下载的文件名是啥? String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1); // 3. 设置想办法让浏览器能够支持(Content-Disposition)下载我们需要的东西,中文文件 名URLEncoder.encode编码,否则有可能乱码 resp.setHeader("Content- Disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8")); // 4. 获取下载文件的输入流 FileInputStream in = new FileInputStream(realPath); // 5. 创建缓冲区 int len = 0; byte[] buffer = new byte[1024]; // 6. 获取OutputStream对象 ServletOutputStream out = resp.getOutputStream(); // 7. 将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据 输出到客户端! while ((len=in.read(buffer))>0){ out.write(buffer,0,len); }in.close(); out.close(); } 

验证码功能

验证怎么来的?

前端实现

后端实现,需要用到 Java 的图片类,生产一个图片 

import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; public class ImageServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //如何让浏览器3秒自动刷新一次; resp.setHeader("refresh","3"); //在内存中创建一个图片 BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB); //得到图片 Graphics2D g = (Graphics2D) image.getGraphics(); //笔 //设置图片的背景颜色 g.setColor(Color.white); g.fillRect(0,0,80,20); //给图片写数据 g.setColor(Color.BLUE); g.setFont(new Font(null,Font.BOLD,20)); g.drawString(makeNum(),0,20); //告诉浏览器,这个请求用图片的方式打开 resp.setContentType("image/jpeg"); //网站存在缓存,不让浏览器缓存 resp.setDateHeader("expires",-1); resp.setHeader("Cache-Control","no-cache"); resp.setHeader("Pragma","no-cache"); //把图片写给浏览器 ImageIO.write(image,"jpg", resp.getOutputStream()); }//生成随机数 private String makeNum(){ Random random = new Random(); String num = random.nextInt(9999999) + ""; StringBuffer sb = new StringBuffer(); for (int i = 0; i < 7-num.length() ; i++) { sb.append("0"); }num = sb.toString() + num; return num; }@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } } 

Session和cookie的区别: 

Cookie是把用户的数据写给用户的浏览器,浏览器保存 (可以保存多个)

Session把用户的数据写到用户独占Session中,服务器端保存 (保存重要的信息,减少服务器资源的浪费)

Session对象由服务创建; 

什么是JSP

Java Server Pages : Java服务器端页面,也和Servlet一样,用于动态Web技术!

最大的特点:

写JSP就像在写HTML

区别:

HTML只给用户提供静态的数据

JSP页面中可以嵌入JAVA代码,为用户提供动态数据; 

JSP表达式 

<%--JSP表达式 作用:用来将程序的输出,输出到客户端 <%= 变量或者表达式%> --%> <%= new java.util.Date()%> 

jsp脚本片段

<%--jsp脚本片段--%> <%int sum = 0; for (int i = 1; i <=100 ; i++) { sum+=i; }out.println("<h1>Sum="+sum+"</h1>"); %> 

JSP声明 

<%!static { System.out.println("Loading Servlet!"); }private int globalVar = 0; public void kuang(){ System.out.println("进入了方法Kuang!"); } %> 

JSP指令

<%@page args.... %> <%@include file=""%> <%--@include会将两个页面合二为一--%> <%@include file="common/header.jsp"%> <h1>网页主体</h1> <%@include file="common/footer.jsp"%> <hr> <%--jSP标签 jsp:include:拼接页面,本质还是三个 --%> <jsp:include page="/common/header.jsp"/> <h1>网页主体</h1> <jsp:include page="/common/footer.jsp"/>