1.什么是javaweb
在java中,动态web资源开发的技术,称为javaWeb。
Web应用组成(静态、动态)
- html、css、js
- jsp、servlet
- java程序
- 外部依赖包.jar
- 配置文件
Web应用程序完成后,需要由服务器统一管理,才可以被外界访问。
2.tomcat服务器
端口(下面的Connector最后的"/“和”>"之间不能有空格,否则项目和tomcat都无法启动 )
主机
如果想把主机换成www.xxxx.com,这样去浏览器是无法访问的。
hosts文件中,对localhost做了映射:
如果给www.xxxx.com也映射到127.0.0.1,那么就可以通过www.xxxx.com访问了。
这是因为网站的访问方式为:
tomcat启动文件和关闭文件。如果在项目中已经运行了tomcat,那么这里的启动文件就不能成功启动了。
tomcat默认主页
index.jsp:可以修改这个文件从而修改默认页面。
web项目部署到tomcat服务器
项目部署到服务器,即web项目要放在webapps文件中,这样就可访问这些资源文件。
- war包:javaweb应用程序;
- jar包:java应用程序;
通过http://localhost:8080/项目名/
进行访问(tomcat默认端口8080,主机localhost)
通过http://localhost:8080/项目名/项目中的具体资源
进行访问
注意:必须先将项目运行起来,然后保证访问的文件在webapps/项目下面存在。访问没有运行的项目中的文件,肯定无法访问到。
例如:访问JDBCTest_war包下面的index.jsp
jsp内容如下:
可以通过http://localhost:8080/JDBCTest_war/
或者http://localhost:8080/JDBCTest_war/index.jsp
总之,每个项目默认会进入该项目的index.jsp页面。
这里的JDBCTest_war
是什么?怎么来的?
有的项目是分模块的,有的是多项目的。选择你想要运行的项目或模块,此时Application Context
(项目上下文/虚拟路径)会自动配置为当前项目或模块的名称。点击apply再运行tomcat就会在localhost:8080/
拼接这个项目上下文路径。然后默认打开选中的该项目或模块的index.jsp文件。
web项目的项目结构
javaWeb的项目网站结构
webapps目录下可以有如下的结构:
所有依赖包最后都会被打包到webapps下面的lib目录;
如果是前后端分离的话,将前端打包的文件放在static下面,和springboot基本相同,确定static的位置即可。
此外,还可以对服务器加密,访问项目地址时需要输入用户名和密码,了解即可,一般用不到。
3.http
4.maven
注意:下载maven的时候
- tar.gz表示linux系统使用;
- zip表示windows使用;
- binary表示工具;
- source表示源码;
maven配置文件
镜像配置(可以配置多个)
配置本地仓库的位置:后面pom.xml中下载的依赖包,都会在这个文件夹下。
配置maven默认的jdk版本:
5.IDEA中maven的使用
创建maven项目
Maven GAV:
G:组,一般为公司域名倒置;
A:项目名;
V:版本;
选择maven的地址、本地仓库、配置文件:
接下来点击finish即可。
然后maven会帮我们导入需要的依赖包,此时IDEA会提示自动导入包,需要手动点击ENable。
等导入完成,可以去本地maven仓库看一下,已经存在了非常多的依赖包。
项目创建完成后,需要查看IDEA中的maven配置是否正确,比如maven地址、maven配置文件、本地仓库的位置是否正确:
自动导入源码、文档:默认不勾选
JRE版本
注意点:
如果创建项目的时候,没有使用maven的模板,此时项目中是没有webapp文件夹的。可以右键项目名称,添加web支持。
如果创建的文件夹是灰色的,可以手动添加标记:
或者在项目结构的module模块进行标记也是一样的。
target为项目输出目录。
在IDEA中添加tomcat
使用本地的tomcat
tomcat的设置
这个警告问题必须解决,方法就是添加当前的项目:
添加一个项目后,警告就消失了。此时上下文路径Application Context
(虚拟路径映射)可以配置,也可以不配置:
tomcat启动成功后,会自动在项目中生成target文件,target文件夹下会有一个lib目录,里面是所有项目导入的依赖包。
IDEA侧边栏
此外,为了避免每次 创建项目时,都需要重新选择maven的地址、本地仓库、配置文件等,需要在创建新项目的页面全局设置maven
6.pom.xml
6.第一个servlet程序
(1)javaweb的servlet需要导入两个依赖包:
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
</dependency>
</dependencies>
(2)写一个类HelloServlet
实现servlet接口,重写doGet和doPost方法(HttpServlet 实现了servlet接口,所以继承HttpServlet这个类也就间接实现了servlet接口)
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8"); //防止向浏览器输出时中文乱码
PrintWriter writer = resp.getWriter(); //响应流
writer.print("hello,韩英俊");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
doGet(req, resp);
}
}
(3)web.xml配置文件注册HelloServlet
给HelloServlet
起一个名字hello,再把hello映射到请求路径/hello
。
这样再浏览器中访问这个请求路径时,就会执行HelloServlet的程序,输出一个响应。
<?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">
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.han.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
这里设置的项目虚拟路径为Servlet_01
运行项目,在浏览器访问localhost:8080/Servlet_01/hello
这次请求成功响应
PrintWriter writer = resp.getWriter(); //响应流
writer.print("hello,韩英俊");
7.servlet的路径映射问题
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.han.servlet.HelloServlet</servlet-class>
</servlet>
(1)一个servlet请求指定一个固定的路径映射
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
(2)一个servlet请求指定多个固定的路径映射
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
...... //每一个路径都是走HelloServlet请求
(3)一个servlet请求指定通用路径映射
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
此时访问项目
localhost:8080/项目虚拟映射路径/hello/ytge
localhost:8080/项目虚拟映射路径/hello/tweuy
localhost:8080/项目虚拟映射路径/hello/fgtweq
也就是*
的位置可以为任意,甚至为空。
(4)默认请求路径
如果此时路径直接为/*
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
这个请求localhost:8080/项目虚拟映射路径/
会进入/*
的请求,而不是进入默认的index.jsp页面。
(5)指定后缀的请求路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>*.study</url-pattern>
</servlet-mapping>
这里指定了一个后缀.study
满足
localhost:8080/项目虚拟映射路径/xxxx.study
localhost:8080/项目虚拟映射路径/xxxx/xxxx.study
的路径都能够请求成功。
注意:如果这里为
<url-pattern>/*.study</url-pattern>
或者<url-pattern>/xxxx/*.study</url-pattern>
运行会直接失败,即不能在前面加上项目映射路径
(6)路径优先级
指定了路径映射的请求优先级较高,如果该映射存在,就会执行对应的servlet请求和响应。通配符的优先级较低。假设映射路径不存在,就会走通配符的请求。
<servlet>
<servlet-name>error</servlet-name>
<servlet-class>com.han.servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>error</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
8.servletContext对象
(1&#x