目录
一、简介:
1.软件结构发展史:
①单机时代——桌面应用
- 桌面应用俗称单机应用,软件所有数据都保存在电脑本地硬盘中。
- 优点:易于使用,结构简单。
- 缺点:数据难以共享、安全性差、更新不及时。
- 如word、eclipse等
②联机时代(Client-Server模式)
- Client/Server结构(C/S结构)指客户端和服务器结构。
- 优点:数据共享方便,安全性高。
- 缺点:必须安装客户端,升级与维护困难。
- 如QQ、微信、支付宝等。
③互联网时代(Browser-Server模式)
- Browser-Server(B/S)模式指浏览器和服务器架构模式。
- 优点:开发简单,无需安装客户端,数据易于共享。
- 缺点:相较于C/S模式,执行速度与用户体验相对较弱。
- 如百度、淘宝、各种网站等。
2.B/S模式执行流程:
通过浏览器把数据发送给服务器 ,服务器生成对应的Html代码并返回给浏览器,浏览器对其解释后显示给用户。
3.请求和响应:
- 从浏览器发送给服务器的数据包称为“请求(Request)”。
- 从服务器返回给浏览器的结果称为“响应(Response)”。
4.J2EE:
- J2EE(Java 2 Platform Enterprise Edition)指 "Java 2 企业版"。它由SUN公司领导,是市场上主流的企业级分布式应用平台的解决方案。
- 开发BS(Web)应用程序就是J2EE最核心的功能。
- J2EE由13个应用模块组成。
5.Apache Tomcat:
- Tomcat是Apache软件基金会旗下一款免费的开源的Web应用服务器程序。
6.J2EE与Tomcat的关系:
- J2EE是一组技术规范和指南,具体实现由软件厂商决定。
- Tomcat是J2EE Web(Servlet和JSP 2个模块)标准的实现者。
- J2SE是J2EE运行的基石,运行Tomcat离不开J2SE(JRE和JDK)。
7.Servlet:
- Servlet(Server Applet)是服务器小程序,只要用于生成动态Web内容。
- Servlet是J2EE最重要的组成部分。
二、Servlet:
例:第一个Servlet
FirstServlet.java:
package com.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FirstServlet extends HttpServlet {
// 重写父类的该方法(参数1:请求,参数2:响应)
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 接收请求发来的参数
String name = request.getParameter("name");
String html = "<h1 style='color:red'>hi," + name + "!<hr></br>";
System.out.println("返回给浏览器的响应数据是:" + html);
PrintWriter out = response.getWriter();
out.println(html); // 将html发送回浏览器
}
}
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>FirstServlet</display-name>
<!-- 声明Servlet -->
<servlet>
<!-- servlet的别名 -->
<servlet-name>first</servlet-name> <!-- 自定义即可。设置原因:1.使用别名更简洁。2.servl的完整路径是敏感信息,不该轻易暴露。所有赋予别名,通过别名绑定URL -->
<servlet-class>com.servlet.FirstServlet</servlet-class>
</servlet>
<!-- 将Servlet和URL绑定 ,注意name要相同 -->
<servlet-mapping>
<servlet-name>first</servlet-name>
<url-pattern>/hi</url-pattern> <!-- 访问时不是直接访问servlet,而是通过设置的<url-pattern>的内容访问 -->
</servlet-mapping>
</web-app>
图解执行流程:
1.标准Java Web工程结构:
组织结构 | 描述 |
tomcat安装目录/webapps/ | Tomcat 应用根目录,存放所有Web应用 |
/web应用目录/ | Java Web 应用目录 |
/web应用目录/index.html(或.jsp) | 默认首页 |
/WEB-INF | WEB应用的安全目录,用于存放配置文件 |
/WEB-INF/web.xml | web.xml是"部署描述符文件",是该Web项目核心配置文件 |
/WEB-INF/classes | 存放编译后的class文件 |
/WEB-INF/lib | 存放web应用依赖的jar文件 |
/META-INF/MANIFEST.MF | 包含Web应用的版本信息 |
2.Servlet开发步骤:
①创建Servlet类,继承HttpServlet类(Servlet与标准Java类的区别)。
②重写service方法,编写程序代码。
③配置web.xml,绑定URL。
3.Servlet访问方法:
- http://IP端口地址/context-path/url-mapping
- 远程访问IP地址,本地访问localhost(默认端口是8080)。
- context-path成为”上下文路径“,默认为工程名。
- url-mapping是映射地址。
例:
package com.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SimpleServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out=response.getWriter(); //getWriter()是向浏览器输出到数据流
out.println("<a href='http://www.baidu.com'>baidu</a>"); //向浏览器输出希望显示的内容
}
}
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>FirstServlet</display-name>
<!-- 声明Servlet -->
<servlet>
<!-- servlet的别名 -->
<servlet-name>simple</servlet-name>
<servlet-class>com.servlet.SimpleServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>simple</servlet-name>
<url-pattern>/simple</url-pattern>
</servlet-mapping>
</web-app>
4.请求参数:
- 请求参数是指浏览器通过请求向Tomcat提交的数据。
- 请求参数通常是用户输入的数据,使Servlet进行处理。
- 格式:参数1=值a&参数2=值b&参数3=值c......
- 请求参数通过URL向服务器发送。
表单如和与servlet连接? 通过<form>标签的action属性。
5.Servlet接收请求参数:
- 接收单个参数:request.getParameter()
- 接收多个同名参数(如复选框):request.getParameterValues()
例:
Student.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>学员信息登记表</h1>
<form action="/FirstServlet/simple"> <!-- http://localhost:8080 是默认指向,不用写 -->
姓名:<input name="name"><br /> 电话:<input name="mobile"><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="Speech" />演讲
<input type="checkbox" name="spec" value="Swim" />游泳<br />
<input type="submit" value="提交"><br />
</form>
</body>
</html>
package com.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SimpleServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
String mobile = request.getParameter("mobile");
String sex = request.getParameter("sex");
String[] spec = request.getParameterValues("spec");
PrintWriter out = response.getWriter(); // getWriter()是向浏览器输出到数据流
out.println("<h1>name:" + name + "</h1>");
out.println("<h1>moblie:" + mobile + "</h1>");
out.println("<h1>sex:" + sex + "</h1>");
for (String n : spec) {
out.println("<h2>spec:" + n + "</h2>");
}
}
}
6.Get和Post方法:
①Get方法是将数据通过在URL附加数据显性向服务器发送数据。
- http://localhost:8080/FirstServlet/sample?name=Isebal
- 表单默认采用get方法
②Post方法是将数据存放在 "请求体" 中隐性向服务器发送数据,并不在URL中体现,我们也看不见。
- http://localhost:8080/FirstServlet/sample
- 请求体:name=Isebal
- 更安全。
③修改表单提交方式:在<form>标签中添加 method=""
地址栏不显示数据了。
注意service()是请求处理的核心方法,无论是get或post都会被service()方法处理。
④可通过getMethod()方法获取当前的提交方法。
package com.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SimpleServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String method=request.getMethod();
PrintWriter out = response.getWriter(); // getWriter()是向浏览器输出到数据流
out.println("<h1>method:" + method + "</h1>");
}
}
⑤Servlet针对Get和Post方法提供了对应的方法处理:doGet()和doPost()。
方法参数格式如下:
package com.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestMethodServlet extends HttpServlet {
@Override
// 处理get请求
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
response.getWriter().println("<h1 style='color:green'>" + name + "</h1>");
}
@Override
// 处理post请求
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
response.getWriter().println("<h1 style='color:red'>" + name + "</h1>");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>FirstServlet</display-name>
<!-- 声明Servlet -->
<servlet>
<!-- servlet的别名 -->
<servlet-name>request_method</servlet-name>
<servlet-class>com.servlet.RequestMethodServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>request_method</servlet-name>
<url-pattern>/request_method</url-pattern>
</servlet-mapping>
</web-app>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>学员信息登记表</h1>
<form action="/FirstServlet/request_method" method="get">
姓名:<input name="name"/><br />
<input type="submit" value="提交"><br />
</form>
</body>
</html>
⑥ 总结:
- service()方法:对所有请求进行无差别处理(实际是区分不同请求转给doGet()方法或doPost()方法)。
- doGet()方法:处理Get请求。
- doPost()方法:处理Post请求。
- Get方式常用于不包含敏感信息的查询功能。
- Post方式用于安全性要求较高的功能或服务器的 " 写 " 操作(如用户登录、用户注册、更新公司账目等)。
7.Servlet生命周期:
①装载:Tomcat解析web.xml,确定servlet存在。
②创建:第一次访问servlet时,创建servlet对象,执行其构造函数。
③初始化:init()
④提供服务:service()、doGet()、doPost()
⑤销毁:当服务重启或关闭时执行destory()。
例:
-
package com.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class FirstServlet extends HttpServlet { public FirstServlet() { System.out.println("正在创建FirstServlet对象!"); } @Override public void init(ServletConfig config) throws ServletException { System.out.println("正在初始化FirstServlet对象!"); } @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 接收请求发来的参数 String name = request.getParameter("name"); String html = "<h1 style='color:red'>hi," + name + "!<hr></br>"; System.out.println("返回给浏览器的响应数据是:" + html); PrintWriter out = response.getWriter(); out.println(html); // 将html发送回浏览器 } @Override public void destroy() { System.out.println("正在销毁FirstServlet对象!"); } }
启动服务器后,会发现控制器没有任何输出,因为只有在首次访问时才会初始化。在页面访问后,控制台完成了②③④步。修改代码保存,应用重启,执行destory()方法。再次访问页面,又重新初始化servlet对象......注意Tomcat全局中只有一个servlet对象。
8.使用注解简化配置:
- Servlet 3.x之后引入了 " 注解Annotation " 特性。
- 注解用于简化Web应用程序的配置过程。
- Servlet核心注解:@WebServlet
例:
package com.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/anno") // 括号内是映射路径 ,告诉Tomcat当前类是一个servlet
public class AnnotationServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().println("I'm AnnotationServlet!");
}
}
不需要再web.xml中配置。
9.启动时加载Servlet:
- 在web.xml中使用<load-on-startup>设置启动时加载
- <load-on-startup>0~9099</load-on-startup> 0表示优先级最高,最先被执行。
- 启动时加载在工作中常用于系统的预处理。
例:
package com.servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
public class CreateServlet extends HttpServlet{
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("正在创建数据库!");
}
}
package com.servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
public class ImportServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("正在导入数据!");
}
}
package com.servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
public class AnalyseServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("正在分析数据!");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<!-- 声明Servlet -->
<servlet>
<!-- servlet的别名 -->
<servlet-name>create</servlet-name> <!-- 自定义即可。设置原因:1.使用别名更简洁。2.servl的完整路径是敏感信息,不该轻易暴露。所有赋予别名,通过别名绑定URL -->
<servlet-class>com.servlet.CreateServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet>
<servlet-name>import</servlet-name>
<servlet-class>com.servlet.ImportServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>analyse</servlet-name>
<servlet-class>com.servlet.AnalyseServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
</web-app>
或者用注解:
注意使用注解开发时,强制要求要设置一个URL,即使用不到这个URL。
package com.servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
@WebServlet(urlPatterns="/ss",loadOnStartup=2)
public class AnalyseServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("正在分析数据!");
}
}
删除web.xml中对AnalyseServlet的配置,运行结果同上。