JavaWeb笔记
1、JavaWeb
2、Tomcat
2.1、Tomcat是什么
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
下载地址:https://tomcat.apache.org/
2.2、Tomcat文件夹
几个重要的文件夹
- bin文件夹:主要存放开启Tomcat和关闭服务的文件(windows:.bat文件,linux:.sh文件)
- conf文件夹:放置Tomcat配置文件
- lib文件夹:依赖库文件夹
- webapps文件夹:放置网站
2.3、启动
windows:执行bin目录下的startup.bat文件
linux:执行bin目录下的startup.sh文件
2.3.1、可能出现问题
- 闪退:查看8080端口是否被其他程序占用
- 乱码:解码问题,并无关系
2.4、关闭
windows:关闭窗口
linux:执行shutdown.sh
3、Maven
3.1、Maven是什么
百度百科:
Maven是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具。
简单点讲就是管理jar包的工具。
3.2、约定大于配置
3.3、Maven下载
官网地址:https://maven.apache.org/
3.4、配置
3.4.1、环境变量(windows)
此电脑右键-》属性-》高级系统设置-》环境变量-》系统变量中
新建俩条系统变量:
变量名:M2_HOME
变量值:Maven压缩后存放的位置\bin(例:D:\Maven\apache-maven-3.6.3\bin)
变量名:MAVEN_HOME
变量值:Maven压缩后存放的位置(例:D:\Maven\apache-maven-3.6.3\bin)
在系统变量Path中添加
%MAVEN_HOME%\bin
3.5、Maven仓库
3.5.1、网址
网址:https://mvnrepository.com/
找下载量多的下载,若更新年份较为久远可选新一些的下载量较多的版本。
3.5.2、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>
<groupId>com.jiuzhao73</groupId>
<artifactId>javaweb-01-servlet03ALL</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
</project>
3.5.3、导入
例子:
<dependencies>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
这也是servlet和jsp需要的jar包
4、Servlet
4.1、Servlet是什么
Servlet是一个java接口,用于处理网络的接口
俩个子类:
- HttpServlet
- GenericServlet
4.2、HttpServlet
UML关系图:
4.3、Servlet原理
Servlet由web服务器(Tomcat)调用,web服务器在收到浏览器请求:
4.4、servlet-mapping
将servlet的class路径映射到url中。
4.4.1、一个servlet-mapping映射一个路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
4.4.2、一个servlet-mapping映射多个路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello1</url-pattern>
</servlet-mapping>
4.4.3、一个servlet-mapping映射通用路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
4.4.4、默认映射设置
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
4.4.5、后缀实现
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>.jiuzhao</url-pattern>
</servlet-mapping>
4.4.6、优先级问题
指定固有路径的映射优先级最高,如果找不到会前往默认的请求。
4.5、HttpServlet几个方法
4.5.1、方法
//getServletConfig() 获取Servlet配置
//getServletContext() 获取Servlet上下文
//getInitParameter() 获取初始化参数
4.5.2、web.xml参数
全局参数:
<!--全局上下文参数-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306</param-value>
</context-param>
servlet参数:
<!--servlet的参数-->
<init-param>
<param-name></param-name>
<param-value></param-value>
</init-param>
4.6、ServletContext
web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用。
多个servlet可以访问共同的ServletContext以达到以下几个目的:
4.6.1、共享数据
web.xml映射配置块
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.jiuzhao73.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getName</servlet-name>
<servlet-class>com.jiuzhao73.GetUserNameContextServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getName</servlet-name>
<url-pattern>/getName</url-pattern>
</servlet-mapping>
可以看成servlet1(作为写入上下文节点的Servlet类):
public class HelloServlet extends HttpServlet {
//getServletConfig() 获取Servlet配置
//getServletContext() 获取Servlet上下文
//getInitParameter() 获取初始化参数
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter w = resp.getWriter();
w.print("<h1>WELCOME!</h1>");
getServletContext().setAttribute("UserName", "久曌");
w.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
可以看成Servlet(作为读取上下文节点的servlet类)
public class GetUserNameContextServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码
resp.setContentType("text/html;charset=UTF-8");
PrintWriter w = resp.getWriter();
ServletContext context = getServletContext();
Object val = context.getAttribute("UserName");
if (val instanceof String) {
w.print("姓名:" + val);
}
w.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
结果:在/getName中看到(姓名:久曌),说明多个Servlet共享同一个ServletContext,并且ServletContext可以进行数据共享。
4.6.2、获取初始化参数
创建getContextParam类:
public class getContextParam extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String val = getServletContext().getInitParameter("url");
PrintWriter w = resp.getWriter();
w.print(val);
w.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
web.xml配置,让getContextParam可以读取
<!--配置参数-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306</param-value>
</context-param>
<servlet>
<servlet-name>getParam</servlet-name>
<servlet-class>com.jiuzhao73.getContextParam</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getParam</servlet-name>
<url-pattern>/getParam</url-pattern>
</servlet-mapping>
4.6.3、请求转发
4.6.3.1、重定向与请求转发
请求转发:
重定向:
请求转发不需要知道C,重定向需要知道。