软件结构发展史

  • 单击模式-桌面应用
  • 联机时代(Client-Server模式)
  • 互联网时代(Browser-Server模式)

单击时代-桌面应用

  • 桌面应用俗称单机应用,软件所有数据都保存在电脑本地硬盘中
  • 优点:易于使用,结构简单
  • 缺点:数据难以共享、安全性差、更新不及时

联机时代(Client-Server模式)

  • Client/Server结构(C/S结构)是指客户端和服务器结构
  • 优点:数据方便共享,安全性高
  • 缺点:必须安装客户端,升级与维护困难

互联网时代(Browser-Server模式)

  • Browser-Server(B/S)模式即浏览器和服务器结构模式
  • 优点:开发简单,无需安装客户端,数据易于共享
  • 缺点:相较于C/S模式,执行速度与用户体验相对较弱

B/S模式执行流程

image-20220418215229936

image-20220415192833606

请求与响应

  • 从浏览器发出送个服务器的数据包称为”请求(Request)”
  • 从服务器返回给浏览器的结果称为”响应(Response)”

image-20220418215248170

JavaEE

JavaEE是什么

  • JavaEE是J2EE的新名称
  • 开发BS(Web)应用程序就是JavaEE最核心的功能
  • JavaEE是由13个功能模块组成

JavaEE中13个功能模块

模块名 模块功能
Servlet web服务器小程序
JSP 服务器页面
JDBC 数据库交互模块
XML XML交互模式
EJB 企业级Java Bean
RMI 远程调用
JNDI 目录服务
JMS 消息服务
JTA 事务管理
JavaMail 发送/接受Email
JAF 安全框架
CORBA 安全框架
JTS CORBA事务框架

Apache Tomcat

  • Tomcat是Apache软件基金会旗下的一款免费的开放源代码的web应用服务器程序

JavaEE与Tomcat的关系

  • JavaEE是一组技术规范与指南,具体实现由软件厂商决定
  • Tomcat是JavaEE Web(Servlet与JSP)标准的实现者
  • JavaSE是JavaEE运行的基石,运行Tomcat离不开JavaSE
  • Tomcat相当于硬件,Servlet相当于硬件上的小程序编写代码

image-20220415203100362

标准Java Web工程结构

组织结构 描述
tomcat安装目录/webapps Tomcat应用根目录
/web应用目录/ Java Web应用目录
/web应用目录/index.html | .jsp 默认首页
/WEB-INF WEB应用的安全目录,用于存放配置文件
/WEB-INF/web.xml web.xml是”部署描述符文件”,是该Web项目核心配置文件
/WEB-INF/classes 存放src下的文件编译后的classes文件
/WEB-INF/lib 用于存放web应用依赖的jar文件
/META-INF/MANIFEST.MF 包含Web应用的版本等信息

JavaEE中的Servlet模块

Servlet模块

  • Servlet(Server Applet)服务器小程序,主要功能用于生成动态Web内容
  • Servlet是JavaEE最重要的组成部分,也是我们学习的重点

Servlet的开发步骤

  • 创建Servlet类,继承HttpServlet
  • 重写service方法,编写程序代码
  • 配置web.xml,绑定URL形成映射

Servlet的访问方法

请求参数的发送与接受

  • 请求参数是指浏览器通过请求向Tomcat提交的数据
  • 请求参数通常是用户输入的数据,待Servlet进行处理
  • 参数名1=值&参数名2=值2&参数名n=…
  • request.getParanmeter() -接收单个参数,返回的是一个字符串
  • request.getParameterValues() -接收多个同名的参数,返回一个数组

创建一个表单:在web目录下创建一个student.html表单,action引向表单传递位置

image-20220418163008112

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<!--student.html-->
<!--网页地址为http://localhost:8080/hi/student.html-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>学生信息登记表</h1>
<form action="http://localhost:8080/hi/sample"><!--action表示的是表单传递的地址-->
姓名:<input name="name"/>
<br/>
电话:<input name="moblie">
<br/>
性别:
<select name="sex" style="width: 100px;padding:5px">
<option value="male"></option>
<option value="female"></option>
</select><br/>
特长:
<input type="checkbox" name="spec" value="English" />英语
<input type="checkbox" name="spec" value="Program" />编程
<input type="checkbox" name="spec" value="Speak" />演讲
<input type="checkbox" name="spec" value="Swimming" />游泳
<br/>
<input type="submit" value="提交">
<br/>

</form>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//sampleservlet,在web.xml中的别名为sample,这里重写的doGet方法
//表单传递的位置是这个java文件
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "SampleServlet", value = "/SampleServlet")
public class SampleServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name=request.getParameter("name");//获取到请求中的单个参数
String mobile=request.getParameter("moblie");
String sex=request.getParameter("sex");
String[] specs=request.getParameterValues("spec");//获取到多个同名参数的数组
PrintWriter out =response.getWriter();//response(响应)向浏览器输出数据流
out.println("<a href='https://www.baidu.com'>Baidu</a>");//向浏览器中输入我们想要的东西,这里是一个超链接
out.println("<h1>name:"+name+"</h1>");//在浏览器中输出请求中的参数
out.println("<h1>moblie:"+mobile+"</h1>");
out.println("<h1>sex:"+sex+"</h1>");
for (int i=0;i<specs.length;i++){//输出同名的参数
out.println("<h1>spec:"+specs[i]+"</h1>");
}
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}
}

Get与Post请求方法

Get与Post处理方式

  • 所有请求 - service()方法
  • Get请求 - doGet()方法
  • Post请求 - doPost()方法

创建第一个Servlet程序

首先创建一个新的Java工程

image-20220418215310029

项目名右击,选择Add Framework Support,增加web Application(web项目应用)

image-20220417164229924

增加后在web项目下的WEB-INF文件下增加classes,lib文件夹

image-20220418215320377

将Tomcat中的servlet-api.jar包导入到项目中WEB-INF文件下的lib目录下,点击File→Project Structure→Modules→Dependencies点击+号导入依赖jar包

image-20220417171309426

将模块编译输出路径更改为WEB-INF文件夹下的classes,点击File→Project Structure→Modules→Paths更改模块编译输出路径

image-20220418215331487

在src文件夹下创建Servlet文件

在Hello类中,自定义了一个新的service()方法,其中通过getMethod()方法判断请求的类型,从而调用doGet()或者doPost()处理get,post请求,使用者只需要继承HttpServlet,然后重写doPost()或者doGet()方法处理请求即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "Hello", value = "/Hello")
public class Hello extends HttpServlet {//实现servlet接口,继承HttpServlet
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接受请求发来的参数(Tomcat是本机搭建的服务器响应请求)
String name = request.getParameter("name");//传入get参数
String html = "<h1 style='color:red'>hi,"+name+"!</h1><hr/>";//将发来的请求放入浏览器网页中
System.out.println("返回给浏览器的响应数据为"+html);
PrintWriter out = response.getWriter();//response(响应)向浏览器输出数据流
out.println(html);//out对象将html的值发送回浏览器
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}
}

编写web.xml文件,向其中编写Servlet的映射

为什么需要编写映射:我们写的JAVA程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务器注册我们写的Servlet,还需要给他一个浏览器能够访问的路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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>HelloServlet</servlet-name><!--Servlet取别名-->
<servlet-class>Hello</servlet-class><!--我们写的类的名字-->
</servlet>

<servlet-mapping><!--将Servlet与URL绑定-->
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/firstservlet</url-pattern><!--URL路径映射-->
</servlet-mapping>
</web-app>

执行流程:

首先客户端发送请求(request)(http://localhost:8080/webserver/firstservlet?name=XFY-Z)到我们的服务器上,请求如果和web.xml下的/firstservlet的虚拟路径相匹配,那么请求就会发送到HelloServlet(别名)所对应的类也就是Hello(我们在src下的java文件),Hello类执行doGet方法方法获得name参数XFY-Z,执行相对应的代码,最后重定向(response)到指定的页面

image-20220418215341702

部署Tomcat,并更改路径为lohost:8080/hi

image-20220418215351163

发布项目到Tomcat服务器上

image-20220417194949102

Servlet生命周期

  • 装载 - web.xml
  • 创建 - 构造函数
  • 初始化 - init()
  • 提供服务 - service()
  • 销毁 - destory()

使用注解简化配置

  • Servlet 3.x之后引入了 “注解Annotation” 特性
  • 注解用于简化Web应用程序的配置过程
  • Servlet核心注解:@WebServlet,相当于标志一样告诉tomcat文件对应的URL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "AnnotationServlet", value = "/AnnotationServlet")//相当于标志一样告诉tomcat文件对应的URL
public class AnnotationServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接受请求发来的参数(Tomcat是本机搭建的服务器响应请求)
String name = request.getParameter("name");
String html = "<h1 style='color:red'>hi,"+name+"!</h1><hr/>";//将发来的请求放入其中
System.out.println("返回给浏览器的响应数据为"+html);
PrintWriter out = response.getWriter();//响应得到的数据然后赋值给out对象
out.println(html);//out对象将html的值发送回浏览器
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}
}

image-20220418205336101

启动时加载Servlet

  • web.xml使用设置启动加载
  • 0~9999
  • 启动时加载在工作中常用系统的预处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//CreateServlet的java类,其中重写了init()初始化方法
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "CreateServlet", value = "/CreateServlet")
public class CreateServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("正在创建数据库");
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//ImportServlet的java类,其中重写了init()初始化方法
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "ImportServlet", value = "/ImportServlet")
public class ImportServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("正在导入数据");
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!--web.xml-->
<?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>CreateServlet</servlet-name><!--Servlet取别名-->
<servlet-class>CreateServlet</servlet-class><!--我们写的类的名字-->
<load-on-startup>0</load-on-startup><!--启动时最先加载-->
</servlet>
<servlet-mapping>
<servlet-name>CreateServlet</servlet-name>
<url-pattern>/create</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>import</servlet-name><!--Servlet取别名-->
<servlet-class>ImportServlet</servlet-class><!--我们写的类的名字-->
<load-on-startup>1</load-on-startup><!--启动时其次于CreateServlet类加载-->
</servlet>
<servlet-mapping>
<servlet-name>import</servlet-name>
<url-pattern>/import</url-pattern>
</servlet-mapping>
</web-app>

image-20220418213904537