整体介绍

了解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冲突的地址