整体介绍
了解Browser-Server(B/S)模式 掌握Servlet开发技巧 掌握Servlet执行原理
软件结构发展史
◆单机时代-桌面应用 ◆联机时代(Client-Server模式) ◆互联网时代(Browser-Server模式)
单机时代-桌面应用
桌面应用俗称单机应用,软件所有数据都保存在电脑本地硬盘中 ◆优点:易于使用,结构简单 ◆缺点:数据难以共享、安全性差、更新不及时 如office word
联机时代(Client-Server模式)
◆Client/Server结构(C/S结构)是指客户端和服务器结构,数据存储在 服务器,客户端与服务器通信即可 ◆优点:数据方便共享,安全性高 ◆缺点:必须安装客户端,升级与维护困难 如qq、微信、支付宝
互联网时代(Browser-Server模式)
◆Browser—Server(B/S)模式即浏览器和服务器架构模式 ◆优点:开发简单,无需安装客户端,数据易于共享 ◆缺点:相较于C/S模式,执行速度与用户体验相对较弱 如各大网站、手机淘宝、京东,嵌入的只是浏览器网页
Tomcat和Servlet
B/S模式执行流程
然后服务器生成文档
请求与响应
◆从浏览器发出送给服务器的数据包称为“请求(Request)’’ ◆从服务器返回给浏览器的结果称为”响应(Response)”
J2EE是什么
◆J2EE (Java 2 Platform Enterprise Edition) “Java 2企业版” ◆开发BS(Web)应用程序就是J2EE最核心的功能 ◆J2EE由13个功能模块组成
J2EE中13个功能模块
Apache Tomcat
◆Tomcat是Apache软件基金会旗下一款免费的开放源代码的Web应用服务器程序。 用来在服务器端动态生成网页,个人电脑能安装阿帕奇,电脑就会变成一台web应用程序服务器
J2EE与Tomcat的关系
◆J2EE是一组技术规范与指南,具体实现由软件厂商决定 ◆Tomcat是J2EE Web(Servlet与JSP)标准的实现者 ◆J2SE是J2EE运行的基石,运行Tomcat离不开J2SE J2SE有JRE、JDK等
Servlet
Tomcat提供硬件基础,Servlet提供软件的实现
◆Servlet(Server Applet)服务器小程序,主要功能用于生成动态Web内容 ◆Servlet是J2EE最重要的组成部分,也是我们学习的重点
Tomcat与Servlet的关系
第一个Servlet
IDEA配置Servlet的坑如下: 2022IntelliJ IDEA 创建Servlet最最最新方法IDEA版本2021.2.2(超详细)附加tomcat (69条消息) IDEA右键创建servlet,没有servlet选项的解决办法
最后,记得Tomcat添加工件进行部署,若找不到对应工件,请在文件→项目结构→工件中进行添加和改名 (69条消息) IDEA中配置Tomcat中的Artifact(工件)
记得标准输出在webapps目录下 (69条消息) IDEA中修改web项目部署的路径为tomcat中的webapps下
在com.imooc.servlet.FirstServlet路径下的FirstServlet.java文件
请选择热更新,就不用多次启动tomcat了,注意,在运行环境下只能更新html等文件,在调试环境下能更新java文件,所以,请选择调试模式
package com.imooc.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "FirstServlet", value = "/FirstServlet")
public class FirstServlet 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);//将html发回浏览器
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
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">
<!-- http://localhost:8080/FirstServlet/hi -->
<!-- 先URL中有/hi找到别名first访问在找到class 别名用途隐藏敏感性息以及便于查看-->
<!-- 声明servlet -->
<servlet>
<!-- servlet的别名 -->
<servlet-name>first</servlet-name>
<servlet-class>com.imooc.servlet.FirstServlet</servlet-class>
</servlet>
<!--将servlet与URL绑定-->
<servlet-mapping>
<servlet-name>first</servlet-name>
<url-pattern>/hi</url-pattern>
</servlet-mapping>
</web-app>
访问域名为:
http://localhost:8080/FirstServlet/hi
?name=HelloWorld是手动在网址栏输入的,后面输入的数据是FirstServlet.java文件需要的参数,能够实现动态网页
因为servlet与url绑定,通过/hi路径查找到servlet-name的别名为first,然后在<servlet>标签队中匹配到first从而得知路径为com.imooc.servlet.FirstServlet,从而访问到FirstServlet.java文件,进行处理
执行流程总结
标准Java Web工程结构
直接在web目录下新建html等文件即可,运行部署会自动发布在tomcat的webapps目录下
Servlet开发与基本配置
Servlet开发步骤
◆创建Servlet类,继承HttpServlet ◆重写service方法,编写程序代码 ◆配置web.xml,绑定URL
Service 方法:
不管是 get 方式还是 post 方式的请求,如果 Servlet 类中有service 方法,则优先调用 Service 方法。
doGet 方法:
在没有 service 方法的情况下如果是 get 方式的请求所调用的处理请求的方法
doPost 方法:
在没有 service 方法的情况下如果是 post 方式的请求所调用的处理请求的方法
注意:
servlet中没有声明service方法,会根据请求方式调用对应的方法进行请求处理,如果在servlet中没有声明对应的请求处理方法,则会报405错误。
Tomact服务器其实只认识service方法,如果我们自己声明的servlet中没有覆写service方法,则会执行HttpServlet的service方法,而HttpServlet中的service方法会根据请求方法调用对应的doXX()方法执行请求处理。
src是源代码目录 Web是发布在tomcat的资源目录 在src的目录下创建Servlet类,继承HttpServlet
public class FirstServlet extends HttpServlet {}
HttpServlet是Sevlet的核心类,里面定义了核心方法
需要重写里面的service方法
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {书写语句}
不用单独写doGet与doPost,改名即可
HttpServletRequest request 代表从浏览器发来的请求 HttpServletResponse response 代表服务器发送给浏览器的响应 都需要引入相应的包
PrintWriter out=response.getwriter();//向浏览器输出的数据流
.getwriter方法需要throws IOException 抛出相应异常
输出自己希望看到设计页面
out.println("<a href='http://www.baidu.com'>Baidu</a>");
此时tomcat不知道这是一个Servlet,需要在web.xml中配置
Servlet访问方法
◆http://IP地址:端口/context—path/url-mapping ◆远程访问使用IP地址,本地访问localhost(127.0.0.1) ◆context-path成为”上下文路径”,默认为工程名
请求参数的发送与接收
请求参数
◆请求参数是指浏览器通过请求向Tomcat提交的数据 ◆请求参数通常是用户输入的数据,待Servlet进行处理
◆参数名1=值1&参数名2=值2&参数名n=…
新加入的html文件如何与之前写的servlet进行联动? 在web目录下加入student.html文件
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>学员信息登记表</title>
</head>
<body>
<h1>学员信息登记表</h1>
<form action="http://LocaLhost:8080/FirstServlet/first" >
姓名:<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="Swimming"/>游泳
<br/>
<input type="submit" value="提交">
<br/>
</form>
</body>
</html>
在form标签对加入action=“http://LocaLhost:8080/FirstServlet/hi” 可以只保留/FirstServlet/hi这一部分 表示表单提交以后发送的地址是什么 在浏览器中输入localhost:8080/FirstServlet/student.html访问
在代码处有
<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="Swimming"/>游泳
value的地方就是勾选后发送的值 勾选相应数据
然后跳转,注意浏览器链接变化
Servlet接收请求参数
◆request.getParameter()-接收单个参数 ◆request.getParameterValues()-接收多个同名参数
获取单个请求参数:
String name = request.getParameter(“name”); 然后结果输出 out.println(“<h1>name:“+name +”</h1>”); 如上面接收name,变成hi,yzyl! 此处变为name:yzyl 同理,输出多个参数:
String name = request.getParameter("name");
String mobile = request.getParameter("mobile");
String sex = request.getParameter("sex");
String[] specs = request.getParameterValues("spec");
PrintWriter out = response.getWriter();//向浏览器输出的数据流
out.println("<h1>method:" + methodName + "</h1>");
out.println("<h1>name:" + name + "</h1>");
out.println("<h1>mobile:" + mobile + "</h1>");
out.println("<h1>sex:" + sex + "</h1>");
for(int i = 0 ; i < specs.length ; i++){
out.println("<h2>spec:" + specs[i] + "</h2>");
}
String[] specs = request.getParameterValues(“spec”); 因为复选框可以勾选多个,所以使用getParameterValues,用for打印输出
Get与Post请求方法
◆Get方式是将数据通过在URL附加数据显性向服务器发送数据。 http://lccalhost:8080/FirstServlet/hi?name=yzyl ◆Post方式会将数据存放在”请求体”中隐性向服务器发送数据 · http://localhost:8080/FirstServlet/hi · 请求体:name=yzyl
在form标签添加method方法
<form action=“http://LocaLhost:8080/FirstServlet/first method = “post”> 结果不变,但url地址栏没有请求体,只有http://localhost:8080/FirstServlet/hi
post方式:
get方法:
可以看出,表单数据变成了查询字符串参数,而且出现请求体
service是请求处理的核心方法,无论是get或者post都会被service()方法处理
获取是哪种请求方法:
String methodName = request.getMethod();
out.println("<h1>method:+"methodName +"</h1>");
因为Get和Post方法处理逻辑不同,需要分开处理,service方法的权限太大,所以需要专门处理这两种方法 doGet()和doPost()两种方法,看上面代码块 我们可以同时分别处理这两种方式,只要更改method即可,而不用service同时处理
Get与Post处理方式
◆所有请求-service()方法 ◆Get请求-doGet()方法 ◆Post请求-doPost()方法
Get与Post应用场景
◆Get常用于不包含敏感信息的查询功能 例如https:/www.baidu.com/s?wd=imooc&rsv_spt=1 ◆Post用于安全性要求较高的功能或者服务器的”写”操作 ・用户登录 ・用户注册 ・更新公司账目
Servlet生命周期
◆装载-web.xml ◆创建-构造函数 ◆初始化-init() ◆提供服务-service() ◆销毁-destroy()
package com.imooc.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "FirstServlet", value = "/FirstServlet")
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 + "!</h1><hr/>";
System.out.println("返回给浏览器的响应数据为:" + html);
PrintWriter out = response.getWriter();
out.println(html);//将html发回浏览器
}
@Override
public void destroy() {
System.out.println("正在销毁FirstServlet对象");
}
}
重新运行tomcat,输入http://localhost:8080/FirstServlet/hi?name=ooo 查看IDEA输出
浏览器再刷新,不会再创建和初始化,只会
返回给浏览器的响应数据为:<h1 style = 'color:red'>hi,ooo!</h1><hr/>
所以在Servlet全局中,有且只有一个Servlet对象,之后所有请求都只会被这个Servlet对象处理
更改代码后,Tomcat会自动重启部署更新,重启时时就会执行销毁对象,再访问就会重新构造初始化
使用注解简化配置
◆Servlet3.X之后引入了”注解Annotation”特性 ◆注解用于简化Web应用程序的配置过程 ◆Servlet核心注解:@VebServlet
src目录下新建Java类
package com.imooc.servlet;
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;
@WebServlet("/anno")
public class AnnotationServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("I'm annotation servlet!");
}
}
@WebServlet(“/anno”)表示注解,/anno是访问路径,不用在web.xml中进行配置了 访问路径为http://localhost:8080/FirstServlet/anno
启动时加载Servlet
◆web.xml使用<load-on-startup>设置启动加载 ◆<load-on-startup>0~9999</load-on-startup> 0的优先级最高,多个servlet如果设置了0的Servlet将会被优先加载 ◆启动时加载在工作中常用于系统的预处理
比如玩游戏时出现界面预加载,加载后好处就是不需要额外处理,提升游戏体验
因为预加载的servlet不需要提供服务,所以不需要绑定URL,URL写在另一个Servlet中,这个过程相当于提供API接口?
我们在分析结果的java类中注解添加预加载:
需要loadOnStartup字段,而且无论是否用到,也必须添加urlPattern=“/xx”,这是servlet的要求,才会产生“正在分析结果”的结果,因为我们没有写service、doGet、doPost等提供服务的方法,所以需要设置一个不会与其他Servlet冲突的地址