JavaWeb
1、基本概念
web开发:
-
web,表示可以从互联网上拿到一定的资源
-
静态web
-
html、css
-
提供给所有人看的数据,始终不会发生变化
-
-
动态web
-
每个人在不同时间、不同地点,看到的信息各不相同
-
技术栈:servlet/JSP、ASP、PHP
-
在Java中,动态web资源开发的计数统称为JavaWeb。
1.1 web应用程序
web应用程序:可以提供浏览器访问的程序;
-
多个web资源,这些web资源可以被外界访问,对外界提供服务;
-
所有能访问到的任何一个页面或者资源,都存在于某一个计算机上
-
URL:统一资源定位符
-
这个统一的web资源会被放在同一个文件夹下,web应用程序-->Tomcat:服务器
-
一个web应用由多个部分组成(静态web、动态web)
-
html、css、js
-
jsp、servlet
-
Java程序
-
jar包
-
配置文件(Properties)
-
web应用程序编写完成之后,若想提供给外界访问:需要一个服务器来统一管理
1.3 静态web
-
*.htm, * .html
静态web的缺点
-
Web页面无法动态更新,所有用户看到的都是同一个页面
-
无法和数据库交互(数据无法持久化,用户无法交互)
1.4 动态web
页面会动态展示,web的页面效果展示因人而异
动态web的缺点:
-
假如服务器的动态web资源出现了错误,我们需要重新编写后台程序,重新发布
-
停机维护
-
动态web的有点:
-
可以动态更新
-
可以与数据库交互(数据持久化)
2、web服务器
ASP:
-
微软:国内最早流行的就是ASP
-
在HTML中嵌入了VB的脚本,ASP+COM
-
在ASP中,页面混乱
-
C#
-
IIS
php:
-
php开发速度很快,功能强大,跨平台,代码简单(70%,WP)
-
无法承载大访问量的情况(局限性)
JSP/Servlet:
-
sun公司主推的B/S架构
-
基于Java语言
-
可以承载三高问题带来的影响
-
语法像ASP
2.1 web服务器
服务器是一种被动的操作,用来处理用户的一些请求和给用户一些响应信息
-
IIS
-
微软的;ASP...Windows中自带的
-
-
Tomcat
3、Tomcat详解
3.1 发布一个网站
-- webapps:Tomcat服务器的web目录
- Root
- name:网站的目录名
- WEB-INF
- class:java程序
- lib:web应用所依赖的jar包
- web.xml:网站配置文件
- index.html 默认的首页
- static
- css
- js
- img
4、HTTP
http(超文本传输协议):简单的请求-响应协议,通常运行在TCP之上。
4.1 两个时代
-
http1.0
-
HTTP/1.0:客户端可以与web服务器连接,只能获得一个web资源
-
-
http1.1
-
HTTP/1.1:客户端可以与web服务器连接后,可以获得多个web资源
-
4.2 http请求
-
请求行
-
请求行中的请求方式:GET
-
请求方式:Get/Post,Head,Delete,Put,Tract...
-
get:请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示数据内容,不安全,但高效
-
post:请求能够携带的参数没有限制,大小没有限制,不会再浏览器的URL地址显示数据内容,安全,但不高效
-
-
-
请求头
-
Accept:告诉浏览器,它所支持的数据类型
-
Accept-Encoding:支持哪种编码格式
-
Accept-Language:告诉浏览器,它的语言环境
-
Cache-Control:缓存控制
-
Conection:告诉浏览器,请求完成是断开还是保持连接
-
4.3 http响应
-
响应体
-
Refresh:告诉客户端多久刷新一次
-
Location:让网页重新定位
-
-
响应状态码
-
200:请求响应成功
-
3XX:请求重定向
-
404:找不到资源
-
5XX:服务器代码错误 502 网关错误
-
5、Maven
-
在JavaWeb开发中,需要使用大量的包
-
需要一个工具自动导入和配置相关的jar包
5.1 Maven项目架构管理工具
Maven的核心思想:约定大于配置
-
有约束,不要违反
Maven会规定好如何去编写Java代码,必须按照这个规范来
5.2 配置环境变量
配置如下配置:
-
M2_HOME:maven目录下的bin目录
-
MAVEN_HOME:maven的目录
-
在系统的path中配置%MAVEN_HOME%\bin
测试是否安装成功:cmd->mvn -version
配置阿里云镜像:
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
配置本地仓库:
<localRepository>E:\apache-maven-3.9.6\maven-repo</localRepository>
5.3 IDEA中使用Maven
勾选Create from archetype可以使用Maven的模板
选中:org.apache.maven.archetypes:maven-archetype-webapp(创建一个简单的JaveWeb项目)
-
IDEA中的Maven设置
-
环境配置
-
Ctrl+Alt+s打开setting页面
-
Build,Execution,Deployment --> Build Tools --> Maven
-
配置默认maven环境
-
-
导入配置
-
Maven --> importing
-
勾选sources,自动导入源码
-
-
5.4 创建缺失文件夹
路径:
-
src/main/
-
java
-
resources
-
-
src/
-
test/java
-
test/resources
-
右键文件,Mark Directory as选择对应文件类型
5.5 POM文件
maven由于他的约定大于配置,可能存在写的配置文件,无法被导出或者生效问题,解决方案:
<build>
<!--在 build 中配置 resources,解决资源导出失败问题-->
<!--include 标签指定哪些文件将被匹配,以*作为通配符-->
<!--exclude 标签指定哪些文件将被忽略,以*作为通配符-->
<!--filtering 构建过程中是否对资源进行过滤,默认false-->
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
5.6 遇到的问题
-
IDEA中每次都要重复配置Maven
-
在IDEA中的全局默认配置中去配置
6、Servlet
6.1 简介
-
Sun公司开发动态web的一门技术
-
Sun公司在这些api中提供了一个接口,叫做Servlet,想要开发一个Servlet程序,需要完成两个步骤
-
编写一个类,实现servlet接口
-
把开发好的Java类部署到web服务器中
-
把实现了Servlet接口的Java程序,叫做Servlet
6.2 Servlet映射
为什么需要映射:我们写的是Java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务中注册我们写的servlet,还需要给他一个能够访问的路径
<!--配置一些web应用初始化参数-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
<!--配置web的核心应用-->
<!--注册Servlet-->
<servlet>
<servlet-name>demo01</servlet-name>
<servlet-class>com.stujc.main.ServletDemo01</servlet-class>
</servlet>
<!-- 一个Servlet对应一个Mapping:映射 -->
<servlet-mapping>
<servlet-name>demo01</servlet-name>
<!--请求路径-->
<url-pattern>/demo01</url-pattern>
</servlet-mapping>
6.3 mapping
优先级问题:指定了固有的映射路径优先级最高,如果找不到就会找默认的处理请求
6.4 ServletContext
web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用。
-
共享数据
-
在这个Servlet中保存的数据,可以在另一个Servlet中拿到
-
PrintWriter writer = resp.getWriter();
writer.println("hello,servlet");
ServletContext context = this.getServletContext();
String userName = "小金";
context.setAttribute("userName",userName); //将一个数据保存在了ServletContext中
String a = (String) context.getAttribute("userName");
writer.println(a);
6.5 读取资源文件
properties:
-
在Java目录下新建propertie
-
在resources目录下新建properties
都被打包到了同一个路径下:classes,我们俗称这个路径为classpath;
6.6 HttpServletRequest
web服务器接收到客户端的http请求,针对这个请求,创建一个代表请求的HttpServletRequest对;
-
获取客户端请求过来的参数
HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中所有的信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息
1 获取前端传递的参数
String userName = req.getParameter("userName");
String passWord = req.getParameter("passWord");
String[] hobbys = req.getParameterValues("hobbys");
System.out.println(userName);
System.out.println(passWord);
System.out.println(Arrays.toString(hobbys));
2 请求转发
// 请求转发,/代表当前的web应用 307
// req.getRequestDispatcher("/success.jsp").forward(req,resp);
6.7 HttpServletResponse
web服务器接收到客户端的http请求,针对这个请求。创建一个代表响应的HttpServletResponse对象;
-
给客户端一些响应信息
-
简单分类
负责向浏览器发送数据的方法
-
ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;
负责向浏览器发送响应头的方法
-
void setCharacterEncoding(String var1); void setContentLength(int var1); void setContentLengthLong(long var1); void setContentType(String var1);
-
常见应用
-
向浏览器输出信息
-
下载文件
-
获取下载文件的路径
-
下载文件的文件名
-
设置想办法让浏览器能够支持下载的东西
-
获取下载文件的输入流
-
创建缓冲区
-
获取OutputStream对象
-
将FileOutputStream流写入到buffer缓冲区
-
使用OutputStream将缓冲区中的数据输出到客户端
-
-
文件下载示例:
public class TestResponse extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String realPath = this.getServletContext().getRealPath("/tony.jpg"); System.out.println("下载文件的路径:"+realPath); realPath = "F:\\InteljWorkSpace\\workspace2024\\javawebDemo\\src\\main\\resources\\tony.jpg"; String fileName = realPath.substring(realPath.lastIndexOf("\\")+1); System.out.println("fileName=="+fileName); resp.setHeader("Content-Disposition","attachment;filename"+ URLEncoder.encode(fileName,"UTF-8")); FileInputStream in = new FileInputStream(realPath); int len = 0; byte[] buffer = new byte[1024]; ServletOutputStream out = resp.getOutputStream(); while ((len=in.read(buffer))>0){ out.write(buffer,0,len); } out.close(); in.close(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
1 验证码
public class ImageServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setHeader("refresh","2");//每五秒,刷新一次 //在内存中创建一个图片 BufferedImage img = new BufferedImage(80,20,BufferedImage.TYPE_INT_BGR); Graphics2D g = (Graphics2D) img.getGraphics();//画笔 g.setColor(Color.white); g.fillRect(0,0,80,80); //给图片写数据 g.setColor(Color.blue); g.setFont(new Font(null,Font.BOLD,20)); g.drawString(makeNum(),0,20); //告诉浏览器,这个请求用图片的方式打开 resp.setContentType("image/jpg"); //网站存在缓存,不让浏览器缓存 resp.setDateHeader("expires",-1); resp.setHeader("Cache-Control","no-cache"); resp.setHeader("pragma","no-cache"); //把图片写给浏览器 boolean write = ImageIO.write(img,"jpg",resp.getOutputStream()); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } private String makeNum(){ Random rd = new Random(); String s = rd.nextInt(9999999)+""; StringBuffer sb = new StringBuffer(); for (int i = 0; i < 7-s.length(); i++) { sb.append("0"); } return sb.toString() + s; } }
2 实现重定向
302 resp.sendRedirect(req.getContextPath()+"/success.jsp");
7、cookie、session
7.1 保存会话的两种技术
cookie
-
客户端技术(响应,请求)
session
-
服务器技术,可以保存用户的会话信息。可以把信息或者数据放在session中
7.2 Cookie
-
从请求中拿到cookie信息
-
服务器响应给客户端cookie
resp.setContentType("text/html"); req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); PrintWriter out = resp.getWriter(); //Cookie,服务器从客户端获取 Cookie[] cookies = req.getCookies();//返回数组,说明cookie可能返回多个 //判断Cookie是否存在 if(cookies != null){ //如果存在 out.write("上一次访问的时间是:"); for (int i = 0; i < cookies.length; i++) { Cookie cookie = cookies[i]; //获取cookie key if("lastLoginTime".equals(cookie.getName())){ Date date = new Date(Long.parseLong(cookie.getValue())); out.write(date.toLocaleString()); } } }else { out.write("初次访问"); } //服务给客户端响应一个cookie Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+""); cookie.setMaxAge(24*60*60);//cookie有效期为1天 resp.addCookie(cookie);
cookie:一般会保存在本地的 用户目录下的AppData
-
一个Cookie只能保存一个信息
-
一个Web站点可以给浏览器发送多个Cookie,最多存放20个
-
Cookie大小有限制 4kb
-
300个Cookie浏览器上线
删除Cookie:
-
不设置有效期,关闭浏览器自动失效
-
设置有效期时间为0
7.3 Session
什么是session
-
服务器会给每一个用户(浏览器)创建一个session对象
-
一个session独占一个浏览器,只要浏览器没有关,这个session就存在
-
用户登录之后,整个网站都可以访问
session和cookie的区别
-
Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
-
Session是把用户数据写到用户独占session中,服务器端保存(保存重要信息,减少服务器资源浪费)
-
Session对象由服务器创建;
8、JSP
8.1 什么是jsp
Jave Server Pages:Java服务器端页面,和Servlet一样,用于动态web技术
最大的特点:
-
写JSP就像在写HTML
-
区别:
-
HTML只给用户提供静态数据
-
JSP页面中可以嵌入Java代码,为用户提供动态数据
-
8.2 jsp原理
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet
JSP最终也会被转换成一个Java类!
JSP本质上就是一个Servlet
-
判断请求
-
内置一些对象
-
输出页面前增加代码
<%--JSP表达式--%> <%-- 作用:用来将程序的输出,输出到客户端 <%=变量或者表达式%> --%> <%= new java.util.Date()%> <hr> <% int sum = 0; for (int i = 0; i <= 100; i++) { sum += i; }; out.println("<h1>Sum="+sum+"</h1>"); %>
JSP声明:会被编译到JSP生成Java类中!其它的,会被生成到_jspService方法中
在JSP中,嵌入Java代码即可
8.3 9大内置对象
-
pageContext
-
Request
-
Response
-
Session
-
Application【ServletContext】
-
config【ServletConfig】
-
out
-
page
-
exception
pageContext.setAttribute("name1","小金1");//保存的数据只在一个页面中有效 request.setAttribute("name2","小金2");//保存的参数只在一次请求中有效,请求转发会携带这个数据 session.setAttribute("name3","小金3");//保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器 application.setAttribute("name4","小金4");//保存的数据只在服务器中有效,从打开服务器到关闭服务器
8.4 Jsp标签、JSTL标签、EL表达式
<!--JSTL表达式的依赖--> <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl-api</artifactId> <version>1.2</version> </dependency> <!--standard的标签库--> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency>
EL表达式:${}
-
获取数据
-
执行运算
-
获取web开发的常用对象
-
调用Java方法
JSTL表达式
JSTL标签库的使用就是为了弥补HTML标签的不足;它自定义许多标签,标签的功能和java代码一样;
<%--引入jstl核心标签库--%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Title</title> </head> <body> <h4>测试</h4> <hr> <form action="coreif.jsp" method="get"> <%--EL表达式获取表单中的数据--%> <input type="text" name="username" value="${param.username}"> <input type="submit" value="登录"> </form> <c:if test="${param.username=='admin'}" var="isAdmin"> <c:out value="管理员欢迎你"/> </c:if> <c:out value="${isAdmin}"/> </body> </html>
<%--foreache遍历--%> <% ArrayList<String> arr = new ArrayList<>(); arr.add(0,"小金1"); arr.add(1,"小金2"); arr.add(2,"小金3"); arr.add(3,"小金4"); arr.add(4,"小金5"); request.setAttribute("list",arr); %> <c:forEach var="arr" items="${list}"> <c:out value="${arr}"/><br> </c:forEach> <hr> <c:forEach var="arr" items="${list}" begin="1" end="3" step="2"> <c:out value="${arr}"/><br> </c:forEach>
<%--chooseWhen选择--%> <c:out value="${isAdmin}"/> <c:set var="score" value="80"/> <c:choose> <c:when test="${score>=90}"> <c:out value="优秀"/> </c:when> <c:when test="${score>=80}"> <c:out value="一般"/> </c:when> </c:choose>
8.5 JavaBean
实体类
JavaBean有特定的写法:
-
必须要有一个无参构造
-
属性必须私有化
-
必须有对应的get/set方法
一般用来和数据库的字段做映射 ORM;
ORM:对象关系映射
-
表--->类
-
字段--->属性
-
行--->对象
9、MVC三层架构
MVC:Model View Control
Servlet和Jsp都可以写java代码:为了易于维护和使用
-
Serlvet专注于处理请求,以及控制试图跳转
-
Jsp专注于显示数据
用户直接访问控制层,控制层可以直接操作数据库
servlet->crud->数据库 //弊端:程序十分臃肿,不利于维护 //Servlet代码中:处理请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码
9.1 MVC三层
Model
-
业务处理:业务逻辑(Service)
-
数据持久层:CRUD(Dao)
View
-
展示数据
-
提供链接,发起Servlet请求
Control
-
接收用户的请求:(req:请求参数、Session信息...)
-
交给业务层处理对应的代码
-
控制视图的跳转
//登录:接收用户的登录请求--->处理用户的请求(获取用户登录的参数,username、password)--->交给业务层处理登录业务(判断用户名和密码是否正确:事务)--->Dao层查询用户名和密码是否正确--->数据库
10、Filter
Filter:用来过滤网站的数据;
-
处理中文乱码
-
登录验证......
Filter开发步骤
package com.stujc.filter; import javax.servlet.*; import java.io.IOException; public class CharacterEncodingFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("初始化完成"); } @Override public void destroy() { System.out.println("销毁"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); System.out.println("characterEncodingFilter执行前..."); chain.doFilter(request,response);// 让请求继续执行,不写就被拦截停止 System.out.println("characterEncodingFilter执行后..."); } }
<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>com.stujc.filter.CharacterEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <!--只要是/servlet下的任何请求,都会经过这个过滤器--> <url-pattern>/servlet/*</url-pattern> </filter-mapping>
11、监听器
package com.stujc.listener; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class TestPanel { public static void main(String[] args) { Frame frame = new Frame(""); Panel panel = new Panel(); frame.setLayout(null); frame.setBounds(300,300,500,500); frame.setBackground(new Color(0,0,255)); panel.setBounds(50,50,300,300); panel.setBackground(new Color(0,255,0)); frame.add(panel); frame.setVisible(true); //监听关闭事件 frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.out.println("关闭ing"); System.exit(0); } @Override public void windowClosed(WindowEvent e) { System.out.println("关闭ed"); } @Override public void windowOpened(WindowEvent e) { System.out.println("打开"); } }); } }
12、JDBC
固定步骤:
-
加载驱动
-
连接数据库
-
向数据库发送SQL的对象Statement:CRUD
-
编写SQL(根据业务不同的SQL)
-
执行SQL
-
关闭连接
拓展:面试题
谈谈网站是如何进行访问的:
-
输入域名,回车
-
检查本机的C:\Windows\System32\drivers\etc\hosts配置文件下有没有这个域名映射
-
有:直接返回对应的ip地址,这个地址中,有我们需要访问的web程序,可以直接访问
-
没有:去DNS服务器找,找到就返回,找不到就返回找不到
-
当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示回来,经历了什么
标签:web,浏览器,JavaWeb,resp,持续性,服务器,out,Day18,请求 From: https://www.cnblogs.com/-Gin/p/18251927