javaEE-Servlet

目录

    • 1、Web开发概述
    • 2、Web开发环境搭建
    • 3、创建发布web项目
    • 4、Servlet概述
    • 5、Servlet创建和使用
      • (1)、必须继承HttpServlet
      • (2)在web.xml 文件中配置Servlet
      • (3)运行Servlet程序
    • 6、Servlet生命周期
    • 7、HTTP协议、http请求
    • 8、HTTP响应
    • 9、Session
    • 10、过滤器

1、Web开发概述

web程序:所有程序部署在服务器端,通过浏览器远程访问。

服务器:提供服务,接收请求,响应

​ 服务器:软件+硬件 广义

​ 软件(程序) 狭义

放置文件(项目),供英特网中其他电脑访问

服务器->Web容器->中间件(连接用户请求与程序)

2、Web开发环境搭建

安装服务器:apache提供的一款开源的服务器Tomcat

(1)配置JAVA_HOME 环境变量

(2)Tomcat根据JAVA_HOME去查找jdk安装位置

(3)Tomcat的bin目录,双击startup.bat命令,启动Tomcat

​ bin放着各种命令,atartup.bat命令,shutdown.bat

​ conf放着配置文件,例如server.xml 修改端口

​ lib tomcat运行所需要的jar包

​ logs运行产生的日志文件

​ temp临时缓存文件

​ webapps部署web程序的目录

​ work工作目录

(4)访问IP+端口号/文件名

3、创建发布web项目

(1)在idea中创建一个基本的java项目

(2)点击 Add Frameworks Support ,创建web项目

(3)写index.xml 网页代码

​ web 配置文件

​ src java代码

(4)部署项目

​ 1、手动部署

​ 项目代码复制到服务器中

​ 2、自动部署

​ 在idea中集成Tomcat
javaEE-Servlet_第1张图片
javaEE-Servlet_第2张图片
javaEE-Servlet_第3张图片

4、Servlet概述

1、Servlet(javaEE,javaWeb)

Servlet->Server + applet --> 用于java编写的服务器端程序
它运行在web服务器中,web服务器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户通信采用“请求/响应”的模式。
作用:

​ (1) 接收客户端浏览器发送的请求

​ (2) 调用其他java代码处理请求

​ (3) 向客户端浏览器做出响应

5、Servlet创建和使用

在创建servlet之前,先导入servlet-api.jar包
复制进入lib包中,右键点击add as library
javaEE-Servlet_第4张图片

(1)、必须继承HttpServlet

自己定义的类 继承HttpServlet

package com.ffyc.firstweb.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class DemoServlet extends HttpServlet {
    /*
    实例化,只被执行一次,只创建一个对象,此对象由服务器创建的
    (1)默认是在客户端第一次访问该servlet时创建servlet对象
    (2)0 值>0时,会在服务器启动时创建
    */
    public DemoServlet() {
        System.out.println("DemoServlet");
    }
    /*
    初始化,当servlet对象创建后,服务器会自动调用init(),完成一些初始化操作args
    如果没有需要初始化的操作,也可以不重写init() ,但服务器会调用父类init()
    */
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init");
        config.getInitParameter("name");
    }
    /*
    为请求提供服务,每一次http请求,都会调用service
    */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("service");
    }
    /*
    当servlet对象销毁时,服务器会调用destroy(),让我们完成一些最终的操作(例如,保存日志)
    如果没有一些最终的操作,也可以不重写destroy(),但服务器会调用父类destroy()
    */
    @Override
    public void destroy() {
        System.out.println("destroy");
    }
}

(2)在web.xml 文件中配置Servlet

元素用于注册Servlet,它包含两个主要的子元素:
和 注册名称和完整类名
元素用于映射,为servlet配置一个供前端访问的映射地
通过url-pattern
web.xml 文件中使用 元素和
xml 属于标记语言,可以扩展,用来保存数据,保存配置文件数据
web.xml 是web程序的配置文件,保存各种配置信息,在服务器启动时,由服务器读取,
它必须放在web应用目录WEB-INF目录下。
javaEE-Servlet_第5张图片

(3)运行Servlet程序

javaEE-Servlet_第6张图片

6、Servlet生命周期

实例化--> 构造方法:只被调用一次,只有第一次访问Servlet时或服务器启动时创建Servlet实例.
初始化–>init方法:只被调用一次,在Servlet实例创建好实例后立即执行,用于执行一些初始化Servlet的操作.
服务–>service方法:多次调用,每次请求都调用service方法,根据请求方式调用doget()方法或dopost()方法.
消亡–>destory:只被调用一次,在服务器关闭时调用,执行一些操作.

7、HTTP协议、http请求

(1)、什么是HTTP?
超文本传输协议(HyperText Transfer Protocol)服务器传输超文本到本地浏览器的传送协议,是互联网上应用最为流行的一种网络协议,用于客户端浏览器和服务器之间交换数据的过程。
HTTP是一个基于TCP/IP通信协议传递数据
属于应用层的协议,由于其简捷,快速的方式,适用于分布式超媒体信息系统。
(2)、http请求
客户端连上服务器后,向服务端请求某个web资源,称为客户端向服务器发送了一个http请求。

请求包括:
请求行,请求头,请求体

请求行:包含http请求方式:请求资源名称,http版本(例如post test.jsp
HTTP/1.1)
请求头:包含主机地址,以及客户端的一些环境信息,以键值对方式传递
javaEE-Servlet_第7张图片
请求体:代表浏览器在post请求方式中传递给服务器的参数,请求体中参数以键值形式传递,多个用&链接,服务器接收到后再解析
在这里插入图片描述
(3)、两种http请求方式
Get方式:
超链接访问,默认是get方式
form提交,不指定method,默认为get方式
POST方式:
form提交,指定method=“post”
Get方式与Post方式的区别
Get方式主要是从服务器获取信息;post主要是向服务器提交信息
Get方式在通过URL提交数据,数据在URL中可以看到;Post方式,数据通过放置在请求体中提交.
Get方式提交的数据大小受限制一般1kb(不同浏览器也会不同);
而POST则没有此限制.

(4)、HttpServletRequest
HttpServletRequest 是ServletRequest的子接口
HttpServletRequest比ServletRequest多了一些针对于Http协议的方法
请求和响应是Web交互最基本的模式,在Servlet中,用HttpServletRequest表示请求
封装了请求的信息,可以从中获取任何请求信息

(5)、获取客户机/服务器信息
(6)、request获取请求参数
getParameter(name) — String 通过name获得值
getParameterValues — String[ ] 通过name获得多值

package com.ffyc.firstweb.servlet;



import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;

public class Demo1Servlet extends HttpServlet {
   /* 
    get/post区别:
    get:从服务器端获取数据,在地址栏会显示发送的数据
    不安全;传输的数据大小受限
    post:从服务端发送数据
    发送的数据在请求体,安全,大小不受限制

   每次请求都要调用service ,由于http请求分为get,post请求
   在servlet中两者处理略微不同
   在父类定义了doget(),dopost() 分别处理 get post请求
   在 父类的service方法中写了一个判断,get->doget  post->dopost*/

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet"+req+resp);
        //请求行
         System.out.println(req.getMethod());//得到客户机请求方式   GET
        System.out.println(req.getProtocol());             //HTTP/1.1
        System.out.println(req.getServerName());//服务器名    localhost
        System.out.println(req.getServerPort());//服务器端口   8080
        System.out.println(req.getScheme());//请求协议         http
        //请求头
        System.out.println(req.getRemoteAddr()); //客户端ip    0:0:0:0:0:0:0:1
        System.out.println(req.getRemotePort());//端口        64272
        System.out.println(req.getHeader("User-Agent"));//电脑信息  Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 
        String name=req.getParameter("name");   //   Safari/537.36
        System.out.println(name);



    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost");
        //接收用户请求的数据,tomcat8.0以后请求数据的解码方式支持中文
        req.setCharacterEncoding("utf-8");
        
        PrintWriter out=null;
        try {
            resp.setContentType("text/html;charset=utf-8");
            out=resp.getWriter();
        } catch (Exception e) {
            e.printStackTrace();

        }


    }

}

8、HTTP响应

(1)一个http响应代表服务器向客户端回送的数据,
包括:
响应行,响应头,响应体
响应行: http协议版本, 以及用于描述服务器对请求的处理结果
HTTP/1/1 (协议版本) 200(状态码) OK(状态码描述)
状态码:服务器和浏览器用于确定状态的固定数字号码
200:请求成功
302;请求重定向
400:语义有误,当前请求无法被服务器理解或请求参数有误
404:请求资源不存在,通常是路径写错了或 服务器资源删除了
500:服务内部错误(代码异常)
(2)HttpServletResponse
HttpServletResponse 是ServletResponse的子接口
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个代表相应的httpservletresponse对象
HttpServletResponse对象代表响应

(3)向浏览器动态生成网页内容
用getWriter() 获得一个printWriter字符输出流输出数据

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost");
        //接收用户请求的数据,tomcat8.0以后请求数据的解码方式支持中文
        req.setCharacterEncoding("utf-8");    
        PrintWriter out=null;
        try {
            resp.setContentType("text/html;charset=utf-8");
            out=resp.getWriter();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

(4)ServletContext
Web容器在启动时,他会为每个Web应用程序都创建一个对应的ServletContext对象.
由于一个 Web应用中的所有Servlet共享同一个ServletContext对象,因此,Servlet对象之间可以通过ServletContext对象来实现数据交互,存储全局信息.
常用方法:
getInitParameter(“name”) 获得当前应用的初始化参数
setAttribute(“attrname”,value) 设置ServletContext 属性并赋值
getAttribute(“attrname”) 获得ServletContext 属性指定值
removeAttribute(“attrname”) 删除ServletContext 指定属性
getRealPath(filename) 获得文件的绝对路径
getContextPath获得当前应用的根目录

9、Session

Servlet API 中,定义了HttpSession接口,用来封装会话对象.
HttpSession 是接口,会话对象是Web容器创建的,在Servlet中使用HttpServletRequest 中的方法获得会话对象
Public HttpSession getSession() : 获取跟当前请求相关的session,如果不存在session,就创建一个新的session对象返回
使用session实现会话机制的过程
1/当容器创建一个新的HttpSession对象后,即生成一个随机数,称为会话ID,并将ID值封装成一个名字为JSESSIONID的session,返回给客户端
2/调用request.getSession方法获得会话对象时,容器先从request中获取JSESSIONID值,根据JSESSIONID值查找到对应的会话对象,返回使用
3/如果没有获取到JSESSIONID值,认为当前的请求没相关的会话对象,重复步骤1
会话对象生命周期
默认时间为30min销毁会话对象
javaEE-Servlet_第8张图片
设置会话时间
设置50min销毁会话

<session-config>
<session-timeout>50</session-timeout>
</session-config>

1.会话对象由谁创建的?
2.会话对象保存在哪里?
有若干客户端与服务器连接,服务器会为每个客户端的一次会话创建一个会话对象

10、过滤器

概念:
过滤器位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求
在请求到达Servlet /JSP 之前,过滤器截获请求
作用:
在客户端的请求访问后端资源之前,拦截这些请求
Servlet API 中,与过滤器有关的API 共有三个接口,分别是:
Filter
FilterChain
FilterConfig

//统一编码过滤器
public class EncodFilter implements Filter {
String code;
//init 对filter对象进行初始化
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init");
code= filterConfig.getInitParameter("code");  //filterConfig 可以获得filter的初始化参数
}

//doFilter  是filter进行过滤操作的方法,是最重要的方法
@Override 
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("doFilter");
servletRequest.setCharacterEncoding(code);//设置编码
filterChain.doFilter(servletRequest,servletResponse);//请求向下执行
}
@Override
public void destroy() {
System.out.println("destory");
}
}

总结:
过滤器用来实现通用的功能,减少代码冗余,提供可维护性
一个过滤器可以配置给多个资源使用
一个资源也可以配置多个过滤器,按照配置顺序调用

你可能感兴趣的:(javaWeb,java-ee,tomcat,java)