软件结构发展史
- 单击模式-桌面应用
- 联机时代(Client-Server模式)
- 互联网时代(Browser-Server模式)
单击时代-桌面应用
- 桌面应用俗称单机应用,软件所有数据都保存在电脑本地硬盘中
- 优点:易于使用,结构简单
- 缺点:数据难以共享、安全性差、更新不及时
联机时代(Client-Server模式)
- Client/Server结构(C/S结构)是指客户端和服务器结构
- 优点:数据方便共享,安全性高
- 缺点:必须安装客户端,升级与维护困难
互联网时代(Browser-Server模式)
- Browser-Server(B/S)模式即浏览器和服务器结构模式
- 优点:开发简单,无需安装客户端,数据易于共享
- 缺点:相较于C/S模式,执行速度与用户体验相对较弱
B/S模式执行流程
请求与响应
- 从浏览器发出送个服务器的数据包称为”请求(Request)”
- 从服务器返回给浏览器的结果称为”响应(Response)”
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相当于硬件上的小程序编写代码
标准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引向表单传递位置
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
|
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>学生信息登记表</h1> <form action="http://localhost:8080/hi/sample"> 姓名:<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
|
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(); 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工程
项目名右击,选择Add Framework Support,增加web Application(web项目应用)
增加后在web项目下的WEB-INF文件下增加classes,lib文件夹
将Tomcat中的servlet-api.jar包导入到项目中WEB-INF文件下的lib目录下,点击File→Project Structure→Modules→Dependencies点击+号导入依赖jar包
将模块编译输出路径更改为WEB-INF文件夹下的classes,点击File→Project Structure→Modules→Paths更改模块编译输出路径
在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 { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = request.getParameter("name"); String html = "<h1 style='color:red'>hi,"+name+"!</h1><hr/>"; System.out.println("返回给浏览器的响应数据为"+html); PrintWriter out = response.getWriter(); out.println(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-class>Hello</servlet-class> </servlet>
<servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/firstservlet</url-pattern> </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)到指定的页面
部署Tomcat,并更改路径为lohost:8080/hi
发布项目到Tomcat服务器上
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") public class AnnotationServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = request.getParameter("name"); String html = "<h1 style='color:red'>hi,"+name+"!</h1><hr/>"; System.out.println("返回给浏览器的响应数据为"+html); PrintWriter out = response.getWriter(); out.println(html); }
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
} }
|
启动时加载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
| 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
| 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
| <?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-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-class>ImportServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>import</servlet-name> <url-pattern>/import</url-pattern> </servlet-mapping> </web-app>
|