Maven、JAVAWeb、Servlet
知识点目标
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
- 点击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,在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)请求转发可以携带数据跳转,重定向数据会丢失