Maven、JAVAWeb、Servlet

发布于:2024-11-29 ⋅ 阅读:(14) ⋅ 点赞:(0)

知识点目标

1、Maven
	Maven是什么
	Maven项目的目录结构
	Maven的Pom文件
	Maven的命令
	Maven依赖管理
	Maven仓库
	JavaWeb项目
2.网络基础知识
3、Servlet

Maven

Maven是什么

Maven是Java的项目管理工具,可以构建,打包,部署项目,还可以管理依赖

为什么要用Maven?

​ 1)用Eclipse开发java项目能否直接导入IDEA?

​ Maven可以规范项目的目录结构,在不同IDE可以直接导入

​ 2)自动管理依赖,帮助下载jar包

Maven安装

1)解压maven

2)配置环境变量

我的电脑右键属性—高级系统设置
在这里插入图片描述

环境变量

在这里插入图片描述

新建环境变量

在这里插入图片描述

添加PATH变量

在这里插入图片描述

运行cmd,输入 mvn -v

在这里插入图片描述

Maven项目结构

新建Maven项目

在这里插入图片描述

设置组id,和项目id

在这里插入图片描述

点击finish

在这里插入图片描述

项目目录结构:

在这里插入图片描述

1)src/main/java 存放Java源码

2)src/main/resources 存放资源(配置文件)

3)src/test/java 存放单元测试

4)pom.xml 核心配置

pom文件

pom(Project Object Model) 项目对象模型

pom.xml 文件结构

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <!--    项目组id-->
    <groupId>com.hopu</groupId>
    <!--    项目id-->
    <artifactId>javawebdemo</artifactId>
    <!--    版本号-->
    <version>1.0-SNAPSHOT</version>
    <!--    打包方式 三种:jar、war、pom-->
    <!--    jar一般项目,直接运行或引入到其它项目-->
    <!--    war 部署服务器-->
    <!--    pom 项目需要被继承-->
    <packaging>jar</packaging>
    <!--    自定义属性值-->
    <properties></properties>
    <!--    依赖-->
    <dependencies>
<!--        <dependency>-->
<!--            <groupId></groupId>-->
<!--            <artifactId></artifactId>-->
<!--        </dependency>-->
    </dependencies>
</project>

Maven的常用命令

在这里插入图片描述

Maven的生命周期:

  • clean 清理项目,删除之前创建的jar文件
  • validate 打包前验证
  • compile 编译项目,源代码编译为字节码
  • test 执行单元测试
  • package 项目打包,生成jar、war文件
  • verify 部署前验证
  • install 将打包好的文件,安装到仓库中
  • site 站点配置,生成报告
  • deploy 部署项目到服务器

Maven的依赖管理

Maven可以帮助开发者管理需要的jar包,自动下载依赖包

Maven的仓库

用于保存jar的目录

分为三种:

1)本地仓库,本地存放jar包的目录

2)远程仓库,在远程服务器上存放jar包

3)中央仓库,Maven官方仓库

一般下载jar包的流程:先看本地仓库是否有jar包,有直接返回,没有再去远程仓库找,找到下载到本地仓库,返回,没有再去中央仓库找

配置阿里云仓库镜像,加速jar包的下载

settings.xml的配置


配置本地仓库的路径
| Default: ${user.home}/.m2/repository
<localRepository>D:/repo</localRepository>

阿里云镜像
 <mirrors>
     <mirror>
      		<id>alimaven</id>
      		<name>aliyun maven</name>
      		<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      		<mirrorOf>central</mirrorOf>        
     </mirror>
</mirrors>

打开idea的配置选项

在这里插入图片描述

修改Maven的目录以及settings文件

在这里插入图片描述

依赖的配置

在pom.xml中配置依赖

    <!--    依赖-->
    <dependencies>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.20</version>
        </dependency>
    </dependencies>

项目的继承和聚合

继承:

Maven中一个项目可以继承另一个项目

子项目可以继承父项目的依赖、属性等配置

父项目的打包方式必须是pom

子项目指定父项目
<parent>
    <artifactId>javawebdemo</artifactId>
    <groupId>com.hopu</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>

聚合:

一个项目可以包含多个子项目,一起打包

<!--    聚合的子模块-->
<modules>
    <module>demo1</module>
    <module>demo2</module>
    <module>demo3</module>
</modules>

依赖冲突的调解

项目导入jar包时,项目中可能会存在同样类型但版本不同的jar包,这就是依赖冲突,最终导致项目无法运行。

那么Maven是如何解决依赖冲突问题的呢?

1)最短路径原则

首先我们要知道,依赖存在传递性,也就是:A依赖B,B依赖C,那么A也依赖C

如果存在下面的情况:A同时存在X依赖的1.0和2.0版本,按最短路径原则,A将使用X2.0版本

A—>B—>C—>X(1.0)

A—>D—>X(2.0)

2)最先声明原则

那么如果路径长度相同怎么办呢?按最先声明原则,哪个依赖在pom中先出现就使用哪个,那么就是X1.0

A—>B—>X(1.0)

A—>D—>X(2.0)

使用Maven构建JavaWeb项目

1)将项目的打包方式改为war

<packaging>war</packaging>

2)打开项目模块设置

在这里插入图片描述

2)在Facets添加web

在这里插入图片描述

  1. 点击create artifact

在这里插入图片描述

4)跳转到aritifact页面

在这里插入图片描述

5)点击Add Config 添加tomcat配置

在这里插入图片描述

6)点击configure选择tomcat

在这里插入图片描述

7)点击deployement 添加部署项目

在这里插入图片描述

8)删除路径

在这里插入图片描述

9)点击Facets页面,点击红色文字,创建webapp目录

在这里插入图片描述

10)在webapp目录创建index.jsp

在这里插入图片描述

11)加入html代码

在这里插入图片描述

12)点击运行tomcat

在这里插入图片描述

网络基础知识

JavaWeb也叫JavaEE,主要用于开发B/S架构

C/S架构和B/S架构

C/S 架构

Client/Server 客户端/服务器模式

​ 需要安装客户端,客户端和服务器进行通信

​ 如:QQ、微信、网络游戏等

​ 优点:

​ 1)客户端性能强大,用户体验好

​ 缺点:

​ 1)单独安装客户端

​ 2)经常升级、更新比较麻烦

B/S 架构

Browser/Server 浏览器/服务器模式

​ 不需要安装客户端,通过浏览器直接访问服务器

​ 如:电商网站、政府网站、企业管理系统、ERP等

​ 优点:

​ 1)使用方便,不需要用户安装客户端,不需要更新

​ 缺点:

​ 1)浏览器性能有限,不能呈现复杂的效果

​ 适用于:用户人数特别大,不需要特别高的视觉效果

HTTP协议

B/S的项目主要通过HTTP协议进行网络通信,采用请求/响应模式

用户使用浏览器向服务器发送请求,服务器查询后将数据返回给浏览器

在这里插入图片描述

HTTP协议的URL有几个部分组成:

http://域名:端口/资源路径?参数=值
如:
https://cn.bing.com/search?q=hello&form=ANNTH1

第一部分:协议
http://或https://属于协议

第二部分:域名
cn.bing.com

第三部分:端口
浏览器默认的端口是80

http请求

http请求报文

在这里插入图片描述

请求方法:

  • GET 参数会放到URL里面,安全性差,长度有限,只能传输字符串,适合查询
  • POST 参数不在URL里面,安全性较高,长度没有限制,数据类型没有限制,适合敏感数据,大量数据传输
  • PUT 执行更新
  • DELETE 执行删除
  • HEAD 查询头部信息
  • OPTION 查询参数信息
  • TRACE 跟踪操作
  • CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器

http响应

http响应报文

在这里插入图片描述

常见响应码:

200 OK 成功

404 资源没有找到

401 没有通过登录验证

403 没有权限

405 请求方法有错误

400 请求参数格式问题

500 服务器内部异常

503 服务没有找到

Servlet

Servlet是服务器小程序,是运行在服务器中的Java程序

入门案例

1)导入依赖

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

2)简单的Servlet

/**
 * 自定义Servlet
 */
public class MyServlet extends HttpServlet {

    //处理get请求
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("你访问了GET方法");
    }

    //处理post请求
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("你访问了POST方法");
    }
}

3)注册

  1. 方法1,在web.xml中
    <servlet>
        <servlet-name>myServlet</servlet-name>
        <servlet-class>com.hopu.servlet.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>myServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

在这里插入图片描述

2、方法2,类加注解

@WebServlet("/helloworld")
public class HelloWorldServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Hello World!!");
    }
}

Servlet的生命周期

Servlet的生命周期包含:

1)实例化,由服务器完成,是第一次被访问时执行一次

2)init() 初始化,是第一次被访问时执行一次

3)service() 服务,客户端每访问一次就会执行一次

4)destory() 销毁,服务器停止前执行一次


//loadOnStartup=-1 第一次访问时初始化  1 启动服务器时初始化
@WebServlet(value = "/helloworld",loadOnStartup = 1)
public class HelloWorldServlet extends HttpServlet {

    public HelloWorldServlet(){
        System.out.println("HelloWorldServlet实例化");
    }

    @Override
    public void init() throws ServletException {
        System.out.println("HelloWorldServlet初始化");
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloWorldServlet服务");
        super.service(req,resp);
    }

    @Override
    public void destroy() {
        System.out.println("HelloWorldServlet销毁");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Hello World!!");
    }
}

请求和响应对象

service方法的两个参数:

  • HttpServletRequest 请求对象
  • HttpServletResponse 响应对象

HttpServletRequest 请求对象

方法 说明
String getParameter(String name) 获得请求参数的值
setCharacterEncoding(String encode) 设置请求编码
String getMethod() 获得请求方法
String getRequestURI() 获得请求地址
String getHeader(String name) 获得请求头

HttpServletResponse 响应对象

方法 说明
PrintWriter getWriter() 获得响应输出流
setCharacterEncoding(String encode) 设置响应编码
setContentType(String type) “text/html;charset=UTF-8” 设置内容类型
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求编码
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        //获得用户传的参数   helloworld?name=xxxx&age=20
        String name = req.getParameter("name");
        String age = req.getParameter("age");
        //获得请求地址
        String url = req.getRequestURI();
        //获得输出流
        PrintWriter writer = resp.getWriter();
        //修改响应的内容类型
        resp.setContentType("text/html;charset=UTF-8");
        //向浏览器输出文字内容
        writer.println("<h1>请求url:" + url + "</h1>");
        writer.println("<h1>Hello!!" + name + "--" + age + "</h1>");
    }

跳转方式

Servlet可以跳转到其它的服务器对象(Servlet/Jsp)

有两种方式:

1)请求转发

2)重定向

请求转发

//请求转发
req.getRequestDispatcher("/hello").forward(req,resp);

在这里插入图片描述

重定向

//重定向
resp.sendRedirect("/hello");

在这里插入图片描述

区别:

1)请求转发 URL不变,重定向 URL会改变

2)请求转发是服务器内部跳转,重定向是服务器外部跳转

3)请求转发客户端只请求一次,重定向需要请求两次,转发更快

4)请求转发可以携带数据跳转,重定向数据会丢失

在这里插入图片描述

在这里插入图片描述