1.web项目基本结构(了解)
1.1web项目结构演示 通过tomcat运行

2.通过统一的命令来使用 项目的创建 打包 编译 (开发 测试 部署)
3.统一的jar包管理 只需要写配置文件 从远程仓库自动下载
2.1maven安装
 下载到本地仓库 需要等待一会(只有第一次需要等待)
安装好后 可以使用maven相关命令 对项目操作
配置
查找需要jar包坐标网站
https://mvnrepository.com/
-->
<dependencies>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.11.3</version>
<!-- jar包作用域
默认值 compile 编译运行时使用
test 测试案例时使用
provided 编译时需要 运行时不需要
runtime 编译时不需要 运行时需要
-->
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.36</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.4.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<!--
项目配置参数
maven的setting.xml配置过了
-->
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- maven 其他插件 tomcat插件 jetty插件 内嵌运行服务器
-->
</project>
3.通过tomcat运行web项目
tomcat是运行java代码的web应用服务器
web服务器 html css javascript
web应用服务器 html css javascript 运行程序语言代码 用代码的输出流输出页面信息
tomcat 小型免费 性能中等 可以商用 200个
jetty 框架中嵌入的小型服务器 性能较差 不能商用
jboss 中型免费 性能中等 可以商用 配置繁琐
weblogic 中大型收费 性能较好 商用 贵
部署集群
tomcat服务器详解:
1.tomcat目录结构
 和 动态技术(通过程序语言的输出流输出页面)
4.1静态技术
) HttpServlet
重写指定的方法 service(){ 当次服务处理的逻辑代码 }
配置请求路径(通过请求路径 触发当前servlet的service()方法运行)
package com.javasm;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/person")
public class PersonServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*servlet
* server applet
* 服务端特定服务的处理
*
**/
//req 请求相关的数据和参数
//resp 响应相关的输出和对象
System.out.println("person处理类运行了......");
//通过url触发代码...
MyPerson myPerson = new MyPerson();
myPerson.readBook();
PrintWriter writer = resp.getWriter();
writer.write("data info");
writer.close();
}
}
4.3实现servlet的三种写法(了解)
HttpServlet —-> GenericServlet —-> Servlet
service() 请求进入时 会默认触发的方法
简化使用方法:
继承HttpServlet 不使用请求分发成get/post等方法 直接重写service()方法
在service()方法中写服务的处理代码
package com.javasm;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/person")
public class PersonServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*servlet
* server applet
* 服务端特定服务的处理
*
**/
//req 请求相关的数据和参数
//resp 响应相关的输出和对象
System.out.println("person处理类运行了......");
//通过url触发代码...
MyPerson myPerson = new MyPerson();
myPerson.readBook();
PrintWriter writer = resp.getWriter();
writer.write("data info");
writer.close();
}
}
4.4servlet两种配置方式(了解)
注解
在类上直接配置请求地址
@WebServlet("/demo2")
public class ServletDemo2 extends GenericServlet {
配置文件
<servlet>
<servlet-name>demo3</servlet-name>
<servlet-class>com.javasm.ServletDemo3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo3</servlet-name>
<url-pattern>/test3</url-pattern>
</servlet-mapping>
4.5servlet生命周期
1.服务器启动时 先准备路径和实例的对应关系(先不创建实例 懒加载)
2.当请求访问到时 先检查是否有示例对象 如果没有则创建实例 调用init方法
3.如果已经有实例 调用service()方法
4.服务器关闭时 销毁实例 调用destroy方法
5.如果配置了load-on-startup 则生命周期提前到服务器启动时创建实例
5.servlet接收请求 返回响应

public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("login服务触发了....");
//tomcat已经解析过请求报文
//给tomcat指定解析请求体的字符编码
//必须在读取第一个参数前设置 否则会失效
req.setCharacterEncoding("utf-8");
String username = req.getParameter("username");
String pwd = req.getParameter("pwd");
//tomcat 默认使用iso8859-1对字符编码
//System.out.println( new String(username.getBytes("iso-8859-1"),"utf-8") );
System.out.println(username);
System.out.println(pwd);
/*
* 查数据库 看数据对不对
* */
//给页面反馈
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.print(username+"
<h1>loginok.....<h1>");
writer.close();
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- 页面中的访问路径
相对路径
相对根路径
绝对路径
-->
<form action="/day9/login" method="post">
<input type="text" name="username"><br>
<input type="password" name="pwd"><br>
<input type="submit"><br>
</form>
</body>
</html>
servelt常见错误:
1.servlet配置地址没带/
报错信息中有这条
servlet映射中的<url pattern>[login]无效
2.servlet请求地址配置重复了
报错信息中有这条
名为 [com.javasm.ServletDemo1]和 [com.javasm.ServletDemo2]
的servlet不能映射为一个url模式(url-pattern) [/demo1]