Java Web基础

Java Web 的学习

前端 后端

前端 Web应用被分类归为分布式应用,一般是客户端——服务器结构

一部分的代码运行在客户端,另一部分代码运行在服务器

客户端上的应用就是前端,通常指的就是我们的浏览器

最常用于前端开发的技术是HTML+CSS+JavaScript

后端 运行在服务器上的代码,需要和数据库打交道

Web 开发

静态web

提供给所有人的数据不会发生变化(html,css)

动态web

提供给所有人的数据会变化

技术栈:Servlet/JSP,ASP,PHP

关于Web应用程序

xxx.html...多个Web资源可以被外界访问,对外界提供服务

任何一个能够被访问的页面或资源都实际存在与世界上的某一台电脑上(URL统一资源定位器)

统一的Web资源放在同一文件夹下,叫做Web程序

一个Web程序由多部分组成

  • html,css,js

  • jsp,servlet

  • java程序

  • 配置文件(Properties)

由一个服务器统一管理,提供给外界访问

静态Web

缺点:无法动态更新,无法与数据库交互(数据无法持久化,无法人机交互)

JavaScript实际开发使用最多

 

动态Web

 

缺点:动态web资源错误需要重写后端

优点:可以人机交互

Web服务器

ASP:微软国内最早流行,在HTML中镶嵌了VB脚本,ASP+COM,C#,IIS(Windows自带)

PHP:开发速度快,代码简答,功能强大,不能承受大访问量

JSP/Servlet: B/S(浏览器,服务器),C/S(客户端,服务器)

安装tomcat

Tomcat

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。

实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的

当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器

内部文件夹

  • bin(启动,关闭的脚本文件)

  • conf(配置)

  • lib(依赖的jar包)

  • logs(日志)

  • temp(临时文件)

  • webapps(存放网站)

通过bin中的startup.bat文件打开tomcat服务(.sh是linux系统使用),若出现闪退则编辑该文件,在文件最末行加入pause,查看错误

在conf文件中server.xml文件打开,< Connector >中改port,可以改变域名

Http协议

(HyperText Transfer Protocol:超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。 简单来说就是一种发布和接收 HTML 页面的方法,被用于在 Web 浏览器和网站服务器之间传递信息。

(很想把菜鸟教程的东西全搬进来)

B/S 架构,默认端口为80

无连接:每次只处理一个请求,收到客户答复后立刻断开

媒体独立:客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送

无状态:无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快

HTTP的消息结构img

HTTP的请求方法:image-20210920215144688

HTTP的响应image-20210920215214281

HTTP的状态码image-20210920215312027

Maven的使用

maven的使用能帮助开发者自动导入jar包

约定大于配置

配置maven

打开maven目录下conf目录,编辑settings.xml文件

  1. 添加一个本地仓库,在文件中可以找到相应的注释

<localRepository>/path/to/local/repo</localRepository>

故在maven目录下创建本地仓库文件

  1. 设置镜像

<mirror>
   <id>maven-default-http-blocker</id>
   <mirrorOf>external:http:*</mirrorOf>
   <name>Pseudo repository to mirror external repositories initially using HTTP.</name>
   <url>http://0.0.0.0/</url>
   <blocked>true</blocked>
 </mirror>-->

可以在百度上找到响应的镜像配置

  1. 配置maven环境变量

    MAVEN_HOME(maven路径)M2_HOME(maven的bin路径)

    path中添加%MAVEN_HOME%\bin

在IDEA中使用maven

new project(maven),勾选Create from archetype

选择maven-archetype-webapp

改用自己的maven版本,文件存储位置

下载jar包

点项目结构,build,execution,deployment

build tools

maven

勾选importing下的sources

在IDEA中导入tomcat后创建文件

Servlet

sun公司的动态web技术,一个接口

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层

实现一个servlet程序

建立Maven项目,更改web.xml为

<?xml version="1.0" encoding="UTF-8"?>
<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>

在项目的pom.xml中加入jar依赖包

<dependencies>
<dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>javax.servlet-api</artifactId>
   <version>4.0.1</version>
   <scope>provided</scope>
</dependency>
</dependencies>

创建java程序,继承HttpServlet类,实现doGet,doPost方法。

再在web.xml中添加

<servlet>
   <servlet-name>name</servlet-name>
   <servlet-class>address</servlet-class>
</servlet>

<servlet-mapping>
   <servlet-name>name</servlet-name>
   <url-pattern>adderss</url-pattern>
</servlet-mapping>

之后在web中添加tomcat

启动

易出现异常点

  1. IDEA与tomcat,maven版本不匹配

  2. 运行中tomcat无法运行,servlet-mapping中地址写错tomcat会报错

init-param 初始参数

context-param 全局参数

ServletContext

ServletContext官方叫servlet上下文。服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象。

可以在同一个项目,不同servlet中传递数据

getServletContext() 获取ServletContext

setAttribute(name(string),value(object)) 向ServletContext中添加数据

getAttribute(name(string)) 读取ServletContext中数据的值

removeAttribute(name) 删除ServletContext中的数据

https://blog.csdn.net/qq_36371449/article/details/80314024

注意

防止传输过程乱码,需要加以下代码

resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
转发,重定向

转发地址不变

重定向地址变

转发时客户端只发送了一次请求,而重定向时客户端需要发送至少两次请求

req.getRequestDispatcher("path").forward(req, resp);
resp.sendRedirect("path");
读取资源文件
//将文件变成流的形式
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
//用相应方法读取
Properties pro = new Properties();
pro.load(is);
String s1 = pro.getProperty("username");
HttpServletResponse

下载文件

//路径
String path = "C:\\Users\\83875\\Desktop\\图片\\1.jpg";
System.out.println(path);
//名字
String name = path.substring(path.lastIndexOf("\\")+1);
//设置响应头
resp.setHeader("Content-Disposition","attachment;filename"+name);
//获取输入流
FileInputStream is = new FileInputStream(path);
//创建缓冲区
byte[] buffer = new byte[1024];
int len = 0;
//输出流
ServletOutputStream sos = resp.getOutputStream();
//传输
while((len=is.read(buffer))>0){
    sos.write(buffer,0,len);
}
is.close();
sos.close();

验证码

HttpServletRequest

可以从ServletContext中获取数据

Cookie

Cookie 是存储在客户端计算机上的文本文件,并保留了各种跟踪信息

 

注意

cookie的name中字符串不能有空格

Servlet Cookie 处理需要对中文进行编码与解码,方法如下:

String   str   =   java.net.URLEncoder.encode("中文","UTF-8");            //编码
String   str   =   java.net.URLDecoder.decode("编码后的字符串","UTF-8");   // 解码
    resp.setContentType("text/html");
    resp.setCharacterEncoding("utf-8");
    req.setCharacterEncoding("utf-8");
Cookie[] cookies = req.getCookies();

PrintWriter w = resp.getWriter();

//由于cookie不会为null所以 w.print("你是第一次访问该网站");无法显示
if(cookies==null)
{
w.print("你是第一次访问该网站");
}else{
for(int i=0;i<cookies.length;i++)
{
if("time".equals(cookies[i].getName())) {
Long l = Long.parseLong(cookies[i].getValue());
Date date = new Date(l);
w.print("你上一次访问该网站时间:" + date);
}
}
}
Cookie cookie = new Cookie("time",System.currentTimeMillis()+"");
resp.addCookie(cookie);
cookie.setMaxAge(-1);
w.close();
}

Session

该接口提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式。

Servlet 容器使用这个接口来创建一个 HTTP 客户端和 HTTP 服务器之间的 session 会话。会话持续一个指定的时间段,跨多个连接或页面请求

//利用session保存数据
HttpSession session = req.getSession();
session.setAttribute("admin","123456");
Date date = new Date(session.getCreationTime());
PrintWriter writer = resp.getWriter();
writer.print(date);
writer.close();
//获取session中的数据
        HttpSession session = req.getSession();
        String s = (String)session.getAttribute("admin");
        resp.getWriter().print(s);
过滤器

Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息

image-20211006202831971

注意:

实现Filter接口,再web.xml文件中导入<filter></filter>,<filter-mapping></filter-mapping>

监听器

实现Listener接口,web.xml文件中导入<listener></listener>

jsp

JSP 与 PHP、ASP、ASP.NET 等语言类似,运行在服务端的语言

可以响应客户端请求,而动态生成 HTML、XML 或其他格式文档的Web网页的技术标准。

JSP 技术是以 Java 语言作为脚本语言的,JSP 网页为整个服务器端的 Java 库单元提供了一个接口来服务于HTTP的应用程序。

image-20211006182617560

如果我们要在页面正常显示中文,我们需要在 JSP 文件头部添加以下代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

image-20211006183456009

image-20211006200217714

https://www.runoob.com/jsp/jsp-actions.html

jsp菜鸟教程

MVC

model(模型)

view (视图)

controller(控制器)

image-20211006201947584

JDBC

java database connectivity

首先在pom.xml中导入mysql依赖包,然后在IDEA中添加数据库

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.23</version>
</dependency>
public class Jdbc {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //Url配置
        String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=ture&characterEncoding=utf-8";
        //用户,密码
        String user = "root";
        String password = "1314520";
        //驱动配置
        String driver = "com.mysql.cj.jdbc.Driver";
        //加载驱动
        Class.forName(driver);
        //链接数据库
        Connection connection = DriverManager.getConnection(url,user,password);
        //向数据库发送sql对象
        Statement statement = connection.createStatement();
        //编写sql语句
        String s = "select * from user;";
        //执行sql
        ResultSet resultSet = statement.executeQuery(s);
        while(resultSet.next()){
            System.out.println("id"+resultSet.getObject("id"));
            System.out.println("name"+resultSet.getObject("name"));
            System.out.println("password"+resultSet.getObject("password"));
            System.out.println("address"+resultSet.getObject("address"));
        }
        //关闭流
        resultSet.close();
        statement.close();
        connection.close();
    }
}

事务

ACID原则

原子性,一致性,隔离性,持久性

原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 一致性(Consistency) 事务前后数据的完整性必须保持一致。 隔离性(Isolation) 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。 持久性(Durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响 ———————————————— 版权声明:本文为CSDN博主「dengjili」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/dengjili/article/details/82468576



posted @ 2021-12-08 20:55  残梦196  阅读(63)  评论(0)    收藏  举报