Java学习笔记——JavaWeb——Servlet

开发架构

C/S架构

即Client-Server(服务器-客户机)结构。C/S结构通常采取两层结构。服务器负责数据的管理,客户机负责完成与用户的交互任务。

B/S结构

(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件。这种模式统一了客户端,将系统功能实现的核心部分集中到服务器上,简化了系统的开发、维护和使用。

比较

B/S架构是从C/S架构改进而来,可以说是三层C/S架构,由此可见两者关系不一般。B/S从C/S中脱离而出,后来随着WEB技术的飞速发展以及人们对网络的依赖程度加深,B/S一举成为当今最流行的网络架构。两种架构都在各自岗位上虎虎生威,它们各有千秋,都是非常重要的网络架构。在响应速度,用户界面,数据安全等方面,C/S强于B/S,但是在业务扩展和适用www条件下,B/S明显胜过C/S。可以这么说,B/S的强项就是C/S的弱项,反之亦然。它们各有优缺点,相互无法取代。 [4] 

C/S结构与B/S结构两种模式各自拥有其特色优势,在不同的系统环境与操作平台下,选择较为接近或交叉进 行混合模式的使用,可以保证数据的敏感性、安全性和稳定发展,还可以加强对数据库的修改与新增记录的操作。 对客户端程序进行保护,提高资源数据的交互性能,实现系统维护成本较低、维护方式较简便、布局更合理、网络数据使用效率较高的目的,采用C/S与B/S混合模式才是最佳方案。

WEB服务器

Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以处理浏览器等Web客户端的请求并返回相应响应,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。目前最主流的三个Web服务器是Apache、 Nginx 、IIS。

Tomcat

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,最大并发访问量500,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。

地址 : https://tomcat.apache.org/

解压到没有中文的路径中

注意:Tomcat的端口默认为 8080

启动

方式一 : 进入bin目录,双击startup.bat文件,启动Tomcat

如没有成功启动需要在环境变量里面的path配置jre的路径。因为Tomcat的运行是依赖本地java环境的

方式二 :通过命令行,执行启动命令startup.bat文件,开启

使用Tomcat

Eclipse :

1 关联Tomcat

导航 -> window -> preference à server

 

 

 

2 创建一个Tomcat服务

 

 

 

 

 

 

Servlet

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

Servlet 执行以下主要任务:

  • 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
  • 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
  • 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
  • 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
  • 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。

Servlet入门程序

一、创建javaweb工程

二、配置项目关联Tomcat

选择项目,右键 ——》Configration build path

三、 编写Servlet程序

import java.io.IOException;

// 如果Tomcat没有配置,就会导包失败
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * @desc 自己的程序 需要 实现 Servlet的接口
 */
public class MyServlet1 implements Servlet{

	public MyServlet1() {
		System.out.println("构造方法 创建Servlet");
	}
	

	public void init(ServletConfig arg0) throws ServletException {
		System.out.println("init 初始化");
	}

	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		System.out.println("service 执行");
	}
	
	public void destroy() {
		System.out.println("destroy 销毁");
	}

	public ServletConfig getServletConfig() {
		return null;
	}

	public String getServletInfo() {
		return null;
	}
}

四、配置web.xml

web.xml 文件的主要目的 :

  1. 配置url和Servlet的映射关系
  2. 配置过滤器

     

  3. 配置监听器
  4. 配置服务器输出参数
  5. 等等
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>day32_servlet</display-name>
  <!-- 当前项目在服务器启动,默认访问首页从以下列表中找
  	根据以下名字,在当前项目的根路径[WebContent]下找对应
  	文件,找到即展示该页面
  	以下6个全部都没找到,报 404
   -->
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- 自己编写的Servlet程序 -->
  <servlet>
  	<!-- 给Servlet取别名 -->
  	<servlet-name>myS1</servlet-name>
  	<!-- 自己编写的Servlet的类路径 -->
  	<servlet-class>com.zhiyou100.servlet.MyServlet1</servlet-class>
  </servlet>
  
  <!-- 制定url请求路径 -->
  <servlet-mapping>
  	<servlet-name>myS1</servlet-name> <!-- 与别名一致 -->
  	<url-pattern>/s1</url-pattern>
  </servlet-mapping>
</web-app>

映射的细节

每次修改web.xml 必须重启服务.

映射路径模板

 

一个Servlet可以处理多个请求 OK

 

一个请求不能由多个Servlet处理 [Failure]

 

注意事项

1 默认启动项目,是使用Eclipse内部的浏览器展现页面 . 可以更改为使用外部浏览器

 

2 发布项目,启动项目

如果使用 点击[Tomcat V8.5xxxx] 右键 add 发布项目,  并启动Tomcat

以上方式, 会启动项目,但是需要自己手动打开浏览器,输入路径http://localhost:8080/项目名/xx   访问

 

3 如果是使用项目名 右键 Run as à Run on Server 运行,会自动发布项目并启动Tomcat ,且打开浏览器

 

4 默认启动项目,访问的是 [WebContent]下的文件, 默认按照Web.xml中指定的欢迎页列表顺序访问,找到对应名字的文件,就展示,找不到就访问404

 

Servlet的生命周期

1 第一次访问该Servlet时才会创建该对象

2 创建之后立即初始化,且只初始化一次

3 每次访问请求对应Servlet,都会 处理请求做出响应

4 当程序虫服务器卸载,或者是服务器直接宕机 Servlet就会销毁

技巧

1 清除Tomcat缓存

2 甚至可以删除Tomcat,重新创建Tomcat

3 清除 项目缓存,让项目重新编译

 

注意

目前为止, 页面资源,要放在WebContent下, 才能被访问到.

不能放在WEB-INF下.

 

 

HttpServlet

介绍

实现Servlet接口,重写了很多方法, init() destroy() getServletConfig() service()等方法,

但是Servlet主要功能 : 接收请求,做出响应. 即除了service() 有对请求处理,做出响应外,其他方法基本很少使用.

所以,为了提高开发效率, 让使用者只针对 浏览器发出的请求进行处理,做出响应

Servlet体系中有 抽象类HttpServlet类,专门用于针对 浏览器发出的请求进行处理,做出响应

 

继承HttpServlet

重写方法

HTTP : 超文本传输协议

协议规定了几种在网络上传输数据的方法

GET 、 POST 、DELETE、 PUT 、HEAD 、TRACE  、OPTIONS 等方法

 

演示 : 浏览器发出get请求,Servlet处理get请求

 

演示: 浏览器发出post请求, 没有对应的处理post的方法

Servlet中没有重写关于处理post请求的doPost方法,那么浏览器发出post请求时,就会报错

 

处理请求

浏览器发出的请求,不乱get .post等,都可以携带数据,也可以不携带数据.

 

一个浏览器发出的请求中有 : 请求行,请求头,请求正文

 

演示:获得请求中的各种数据

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;



/**

 * @desc HttpServlet类 主要用于处理请求,做出响应

 * 虽然是抽象类,但是不强制重写任何一个方法

 * 而是要程序员根据实际情况,要处理什么请求,就重写什么方法

 */

public class MyServlet1 extends HttpServlet{



    /**

     * 重新doGet方法 用于处理浏览器发出的GET请求

     * @param req : 当前Servlet一旦创建初始化,该参数中就

     *             包含有所有的请求数据

     */

    @Override

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // --- 请求行 ---

        String method = req.getMethod(); // 请求方法

        // uri 资源标识符 : 代表请求的资源路径

        String uri = req.getRequestURI(); // 获得请求路径

        // url 资源定位符 : 请求的全路径

        StringBuffer url = req.getRequestURL();

        String protocol = req.getProtocol(); // 获得请求协议

        System.out.println(method+" "+uri+" "+protocol);

        System.out.println(url);

        // --- 请求头 ---

        // 获得所有请求头的名字

        Enumeration<String> headerNames = req.getHeaderNames();

        while(headerNames.hasMoreElements()) {

            String headName = headerNames.nextElement();

            // 根据请求头的名字获得请求头的值

            String headerValue = req.getHeader(headName);

            System.out.println(headName+": "+headerValue);

        }

        // --- 请求正文 ---

        // 获得请求参数,返回的是String字符串

        String id = req.getParameter("id"); // 请求中的name值,name=value

        String name = req.getParameter("name");

        System.out.println("id = "+id +", name = "+name);

    }

   

}

 

演示 : from表单提交各种类型数据,后台接收

后台接收 ——》Servlet接收请求,从请求中获得请求数据

import java.io.IOException;

import java.util.Enumeration;



import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;



public class MyServlet2 extends HttpServlet{

      

       @Override

       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

              /*

               * 表单中的输入框(明文,暗文,文件,日期,单选,下拉框)

               * req.getParameter(name)

               * 方法可以获得上述所以数据

               * 方法的参数name 是,表单中input标签name属性的值

               */

              String username = req.getParameter("username");

              // 接收到数据全部是字符串,如果需要转为数字 , Integer.parseInt()的等方法

              String password = req.getParameter("pwd");

              // 文件上传,只能使用post

              String file = req.getParameter("file");

              // 字符串类型的日期值 : yyyy-MM-dd ==> SimpleDataFormat解析为日期对象

              String birthday = req.getParameter("birthday");

              String sex = req.getParameter("sex");

              String address = req.getParameter("address");

              System.out.println(username);

              System.out.println(password);

              System.out.println(file);

              System.out.println(birthday);

              System.out.println(sex);

              System.out.println(address);

              /*

               * 复选框获取 getParameterValues()

               * 如果复选框不选任何值,字符串数组是null

               */

              String[] hobbies = req.getParameterValues("hobby");

              for (int i = 0; hobbies != null && i < hobbies.length; i++) {

                     System.out.println(hobbies[i]);

              }

       }

      

}

 

路径问题

Get和Post的区别

请求方式

GET

POST

参数位置

urlquery

一般在content

参数大小

受限于浏览器url大小,一般不超过2K

1G

服务器数据接收

接收1

根据数据大小,可分多次接收

适用场景(语义)

从服务器端获取数据,不做增删改

向服务器提交数据,如做增删改操作

安全性

参数携带在url中,安全性低

相对于GET请求,安全性更高

GET在浏览器回退时是无害的,而POST会再次提交请求。

 

GET产生的URL地址可以被Bookmark,而POST不可以。

 

GET请求会被浏览器主动cache,而POST不会,除非手动设置。

 

GET请求只能进行url编码,而POST支持多种编码方式。

 

GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。

GET请求在URL中传送的参数是有长度限制的,而POST么有。

 

对参数的数据类型,GET只接受ASCII字符,而POST没有限制。

 

GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。

 

GET参数通过URL传递,POST放在Request body中

 

处理请求(HttpServletRequest)之跳转 —— 请求转发

跳转页面

演示 : a页面发出请求,经过Servlet,接收到请求,让页面跳转至b页面

 


=====

 

跳转Servlet

演示 : 浏览器发出/s1请求.请求到servlet1,但是servlet1将请求转到servlet2,由servlet2真正的处理请求,做出响应

 

<servlet>

    <servlet-name>s1</servlet-name>

    <servlet-class>com.zhiyou100.servlet.Servlet1</servlet-class>

  </servlet>

 

  <servlet-mapping>

    <servlet-name>s1</servlet-name>

    <url-pattern>/s1</url-pattern>

  </servlet-mapping>

  <!-- ===================================================== -->

 <servlet>

    <servlet-name>s2</servlet-name>

    <servlet-class>com.zhiyou100.servlet.Servlet2</servlet-class>

  </servlet>

 

  <servlet-mapping>

    <servlet-name>s2</servlet-name>

    <url-pattern>/s2</url-pattern>

  </servlet-mapping>

请求转发(forward)特点

1 请求转发是服务器行为

2 地址栏不会改变

3 一次请求

4 请求域中的数据可以在请求转发的类之间共享

HttpServletRequest 做域对象-请求域

域对象 : 理解为一片区域,里面存储的有数据.

 

// Servlet1类, 向域对象存储数据,并请求转发至Servlet2类

// 从Servlet2类中获得请求域中的数据

 

 

做出响应-HttpServletResponse

响应也有对应的响应消息行 响应消息头 响应消息正文

响应行/头/正文


package com.zhiyou100.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;



/**

 * @desc  响应

 */

public class Servlet3 extends HttpServlet{



    @Override

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 接收请求

        // 做出响应

        /*

         *  设置响应状态码

         *  200 ok

         *  302/307 重定向

         *  400

         *  404 资源未找到

         *  405

         *  500 服务错误

         *  505

         */

        System.out.println("doGet执行了");

        String name = req.getParameter("name");

//      resp.setStatus(404);

        // 设置响应内容类型及编码格式

        resp.setContentType("text/html;charset=utf-8");

        // 响应正文 ->使用输出流向浏览器写数据

        // 得到输出流对象

        PrintWriter writer = resp.getWriter();

        // 向浏览器输出数据

        writer.write("Hello World 你好世界");

        writer.write("<html>");

        writer.write("<head>");

        writer.write("<title>");

        writer.write("首页");

        writer.write("</title>");

        writer.write("</head>");

        writer.write("<body bgcolor='red'>");

        // 后台的数据,可以展现在前台页面

        writer.write("<h1>这是首页,欢迎"+name+"</h1>");

        writer.write("</body>");

        writer.write("</html>");

        // 使用servlet直接写html,很麻烦,不推荐

        // 后续会使用jsp技术解决上述问题

    }

   

}

重定向-跳转页面

 

重定向-跳转Servlet

重定向(redirect)的特点

1)重定向是浏览器行为

2)地址栏会变

3)两次请求

4)请求域中的数据可以在重定向的类之间不可以共享

       在a类的请求域存储数据,从a类请求转发到b类,在b类从请求域取不出数据

 

Servlet API中forware()和redirect()的区别?

答:

a、浏览器显示

     重定向会改变URL地址,请求转发不会改变URL地址。

b、资源共享

     重定向不可以资源共享,请求转发可以。

c、功能

    重定向可以用URL绝对路径访问其他Web服务器的资源,而请求转发只能在一个Web应用程序内进行资源转发,即服务器内部的一种操作。

d、效率

    重定向效率低,相当于再一次请求;请求转发效率相对较高,跳转仅发生在服务器端。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值