Servlet学习

web开发概述

1.web程序

所有的程序都部署在服务器端,通过浏览器远程访问

服务器:

提供服务  接收请求  响应
服务器:广义: 软件+硬件                  狭义:软件(程序)
放置文件(项目)    供因特网中的其他电脑访问
服务器-->web容器-->中间件(连接用户请求    与程序)

2.web环境搭建

	安装服务器   apache提供的一款开源的服务器   tomcat
	官网下载
	解压
	配置JAVA_HOME环境变量   (到java.jdk的路径)
	TOMCAT根据java_home去查找jdk安装位置
	在tomcat的bin目录 双击运行    startup.bat命令   启动tomcat
	bin 放着各种命令   startup.bat命令启动       shutdown.bat命令关闭
	conf放着配置文件   例如server.xml   修改端口号
	lib tomcat运行所需要的jar包
	logs 运行产生的日志文件
	temp 临时缓存文件
	webapps 部署web程序的目录
	work 工作目录
	访问   IP+端口/文件名

在这里插入图片描述
在这里插入图片描述
搭建完成

创建发布web项目

在ider中创建一个基本的java项目
右键 add webramework 变为web项目
项目
src java代码
web 配置文件   网页代码

发布方式
手动发布:自己把项目中的代码粘贴到服务器中,平时开发不用(淘汰)
自动发布:自动将web应用发布到web服务器下,需要在开发工具中集成tomcat进来

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

Servlet(JavaEE javaWEB)
servlet ==>server +apple---->用java编写的服务器端程序
它运行在web服务器中,web服务器负责Servlet和客户的通信以及调用Servlet方法,Servlet和客户通信采用"请求/响应"的模式。

作用:
1.接收用户发送的请求
2.调用其他的Java程序来处理请求
3.根据处理结果,服务器将响应返回给客户端

Servlet的常见和使用

1.创建一个类继承javax.servelt.http包下的HttpServlet
2.在web.xml文件中配置Servlet
3.运行Servlet程序
	 通过浏览器访问http:localhost:8080/helloword/配置的url-pattern
由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。

Servlet创建和使用-Servlet配置

	<servlet>元素用于注册Servlet
	它包含由=有两个主要的子元素
	<servlet-name>和<servlet-class>
	分别用于设置Servlet的注册名称和Servlet的完整类名
	一个<servlet-mapping>元素
	用于映射一个已注册的Servlet的一个对外访问路径
	它包含有两个元素:<servlet-name>和<url-pattern>
	分别用于指定Servlet的注册名称和Servlet的对外访问路径
	url-pattern配置模式:"/"代表当前web应用的根目录
	精确匹配 例如/test  访问http://10.43.11.143/myapp/test
	匹配任意的url 例如/*  访问http://10.43.11.143/myapp/abc
	<servlet-mapping>
	     <servlet-name>MyServlet</servlet-name>
	     <url-pattern>/table</url-pattern>
	     </servlet-mapping>

创建发布的web项目-web.xml文件

Web.xml文件为web应用的配置文件
它必须放在web应用目录WEB-INF目录下。
Web.xml文件用于对web应用下的web资源进行配置
服务器在启动时会读取web.xml文件中的内容。

在这里插入图片描述
在这里插入图片描述

package com.slg.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;
/*
* 继承HttpServlet
* 重写父类方法
* 配置servlet
* */
public class DemoServlet extends HttpServlet {
    /*无参构造方法
    * 初始化对象
    * */
    public DemoServlet(){
        System.out.println("DemoServlet");
    }
    /*
    *初始化
    * */

    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init");
    }

    /*
    * 服务
    * */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("service");
    }

    /*
    * 销毁
    * */
    @Override
    public void destroy() {
        System.out.println("destroy");
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Servlet详细介绍
web开发流程
在这里插入图片描述
servlet的生命周期
在这里插入图片描述
在这里插入图片描述

package com.slg.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;
/*
* 继承HttpServlet
* 重写父类方法
* 配置servlet
* */
public class DemoServlet extends HttpServlet {
    /*无参构造方法
    * 初始化对象
    * {
    * 只被执行一次,只创建了一个对象, 此对象由服务器创建的
    * 默认:客户端第一次访问该servlet时创建servlet对象
    *  配置后: <load-on-startup>0</load-on-startup><!--值大于等于0时启动时创建servlet对象-->
    *  }
    * */
    public DemoServlet(){
        System.out.println("DemoServlet");
    }
    /*
    *初始化
    * 当servlet对象创建后,服务器会自动调用init()
    * 完成一些初始化操作
    * 如果我们没有初始化操作,可以不重写init()方法,但是服务器会调用父类的。
    * */
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init");
        System.out.println( config.getInitParameter("name"));;//获得配置文件中的信息
        System.out.println(config.getServletName());
    }
    /*
    * 服务
    * 为请求提供服务,每一此http请求都会调用servlet(请求/响应)
    * */
    @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");
    }*/
}

在这里插入图片描述

http协议
什么是HTTP?

超文本传输协议服务器传输超文本到到本地浏览器的传送协议
是互联网上应用最为流行的一种网络协议
用于定义客户端浏览器和服务器之间交换数据的过程。
HTTP是一个基于TCP/IP通信协议来传输数据。
HTTP是一个属于应用层的协议,由于其简捷,快速 的方式
适用于分布式超媒体信息系统

http请求

客户端连上服务器后,向服务器请求某个web资源
称之为客户端向服务器发送了http请求
请求包括:
	请求行
	请求头
	请求体
请求行包含http请求方式,请求资源名称,http版本
请求头包含主机地址,以及客户端的一些环境信息
以键值对的形式传递。
请求体代表着浏览器在pos请求方式中传递给服务器的参数
请求体中参数以键值形式传递
多个用&连接,服务器接收到后在解析
例如:username=admin&userpwd=123

两种http的请求方式

GET方式:
	超链接访问,默认是GET方式
	form提交,不指定method,默认为GET方式

POST方式:
	form提交,指定method="POST"

Get方式与Post方式的区别

Get方式主要是从服务器获取信息
Post方式主要是向服务器提交信息
Get方式在通过URL提交数据,数据可在URL中看见
Post方式数据在URL中不可见,数据放置在请求体中提交
Get方式提交数据大小受限制(一般为1kb,与浏览器有关)
Post方式则没有限制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我的第一个web程序</title>
</head>
<body>
<!--
从浏览器中以超链接,表单等向服务器发送的请求等称为http请求
请求行,请求头(这两部分浏览器会自动发送),请求体
请求行:请求地址,请求方式(get,post),协议版本
get/post的区别
    get:
        从服务器端获取数据
        在地址栏会显示发送的数据
          1.不安全
          2.传输的数据大小受限,一般为2kb-5kb与浏览器有关
    post:
        向服务器端发送数据

请求头:服务器端和客户端的一些信息
请求体:是指表单post方式请求时,像服务器发送的数据
在服务器端接收信息
    处理
    响应
-->
<a href="demourl?name=jim&age=12">列表</a>
<form action="demourl">
    账号:<input type="text"><br>
    密码:<input type="password"><br>
    <input type="submit" value="发送">
</form>
</body>
</html>

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
post方式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我的第一个web程序</title>
</head>
<body>
<!--
从浏览器中以超链接,表单等向服务器发送的请求等称为http请求
请求行,请求头(这两部分浏览器会自动发送),请求体
请求行:请求地址,请求方式(get,post),协议版本
get/post的区别
    get:
        从服务器端获取数据
        在地址栏会显示发送的数据
          1.不安全
          2.传输的数据大小受限,一般为2kb-5kb与浏览器有关
    post:
        向服务器端发送数据

请求头:服务器端和客户端的一些信息
请求体:是指表单post方式请求时,像服务器发送的数据
在服务器端接收信息
    处理
    响应
-->
<a href="demourl?name=jim&age=12">列表</a>
<form action="demourl" method="post">
    账号:<input type="text" name="account"><br>
    密码:<input type="password" name="password"><br>
    <input type="submit" value="发送">
</form>
</body>
</html>

在这里插入图片描述
在这里插入图片描述

HttpServletRequest

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

获取客户机/服务器信息

getMethod() 得到客户机请求方式
getScheme() 请求协议
getRemoteAddr()  返回发出请求的客户机的IP地址
getServletName() 获得服务器名(ip域名)
getServletPort()  服务器端口

request获取请求参数

	getParameter(name)    ---String通过name获得值
	getParameterValues ---String[ ] 通过name获得多值
	整理中文乱码
		post 
			setCharacterEncoding(编码格式)

HttpServletReponse

HttpServletResponse是ServletResponse的子接口
web服务器接收到客户的http请求
会针对每次一请求
分别创建一个代表响应的HttpServletResponse对象
HttpServletResponse对象代表响应。

向浏览器动态生成网页内容
用getWriter()获得一个Print Writer字符输出流输出数据,response会默认以ISO8859-1将需要输出到浏览器的字符进行解码,如果输出的字符在ISO8859-1中不存在,就会导致乱码问题。


response.setContetnType(“text/html;charset=utf-8”);方法可以同时设定response所使用的字符集编码和浏览器打开所用的字符集编码。

ServletContext
web容器在启动时,它会为每个web应用程序都创建一个对应的ServletContext对象。

由于一个web应用中所有Servlet共享一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现数据交互,存储一些全局信息。

常用方法:

getInitParameter("name")  
			获得当前应用的初始化参数
setAttribute("attrname",value)
			设置Servlet Context属性并赋值
getAttribute("attrname")
			获得ServletContext属性指定值
removeAttribute("attrname")
			删除ServletContext指定属性
getRealPath(filename) 
			获得文件的绝对路径
getContextPath() 
			获得当前应用的根目录
package com.slg.firstweb.servlet;
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.util.Arrays;

public class Demo1Servlet extends HttpServlet {
    //构造方法默认有
    //init()  不需要可以不重写,服务器调用父类的
    //Service() 每次请求都需要调用 ,由于http请求分别为get,post请求,在servlet中两者处理上略微不同
    //所以父类中定义了doGet()  doPost()分别处理get,post请求
    /*
    * doget()处理get请求
    * //org.apache.catalina.connector.RequestFacade@5d196331
    * */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet"+req);
        //请求行数据
        System.out.println(req.getMethod());//获取请求方式
        System.out.println(req.getProtocol());//获得协议
        System.out.println(req.getServerName());//
        System.out.println(req.getServerPort());

        //请求头
        System.out.println(req.getRemoteAddr());//获得客户端的ip
        System.out.println(req.getRemotePort());//客户端端口
        System.out.println(req.getHeaders("User-Agent"));

        //接收用户请求的数据   tomcat8.0以后get请求数据的解码方式支持中文

        String name = req.getParameter("name");
        System.out.println(name);
        System.out.println(req.getParameter("age"));
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost"+req);
        req.setCharacterEncoding("utf-8");//设置post请求数据解码格式
        System.out.println(req.getParameter("account"));//获得账号
        System.out.println(req.getParameter("password"));//获得密码
        System.out.println(req.getParameter("sex"));//获得性别
        String[] courses = req.getParameterValues("course");
        System.out.println(Arrays.toString(courses));//获得课程
    }
    //destroy 不需要可以不重写,服务器调用父类的
}

在这里插入图片描述

在这里插入图片描述

	接收多个值需要用到:req.getParameterValues

session
Session对象是javax.servlet.http.HttpSession的实例
它在第一个JSP页面被装载时自动创建,完成绘画期管理。

从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为这一个会话。

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

HttpSession接口中定义了一系列的方法

返回值类型方法名称说明
voidsetAttribute(String key, Object value)以key/ value的形式保存对象值
ObjectgetAttribute(String key)通过key获取对象值
voidremoveAttribute(String key)通过key删除属性
intgetMaxInactiveInterval()获取session的有效非活动时间,以秒为单位
voidsetMaxInactiveInterval(int interval)设置session的最大非活动时间,以秒为单位,超时将被销毁
StringgetId()获取session对象的编号
voidinvalidate()设置session对象失效
booleanisNew()判断一个session是不是一个新创建的会话对象

会话对象的生命周期
会话对象是容器创建的,并保存在容器中,如果客户端连接到服务器后,却置之不理,不做任何操作,那么容器维护这些会话对象将占用很多资源,因此容器都会在默认时间内销毁会话对象,多数容器默认30分钟销毁会话对象。
除了根据有效时间使会话对象失效外,还可以调用HTTP Session中的invalidate方法,使会话失效,立即销毁会话对象。

会话对象(session)由谁创建的?
有若干个客户端与服务器连接,服务器会为每个客户端的一次会话创建一个会话对象。


过滤器的概念与作用
概念:

过滤器位于客户端和web应用程序之间
用于检查和修改两者之间流过的请求
在请求到达Servlet/JSP之前,过滤器截获请求
作用:
	在客户端的请求访问后端资源之前
拦截这些请求

过滤器相关的API
servlet API,与过滤器有关的API共有三个接口,分别是:

Filter接口
	是过滤器类必须实现的接口,该接口中有三个方法
		init():该方法是对filter对象进行初始化的方法
				仅在容器初始化filter对象结束后被调用一次
				参数FIlterConfig可以获得filter的初始化参数
		doFilter():该方法是filter进行过滤操作的方法
						是最重要的方法,过滤器实现类必须实现该方法
						方法体中可以对request和response进行预处理
						其中FilterChain可以将处理后的request和response对象传递到过滤链上的下一个资源。
		destroy():该方法在容器销毁过滤器对象前被调用。
			
	
FilterChain接口
	该接口类型作为Filter接口中doFilter方法的参数使用
	FilterChain接口中有一个方法
		doFilter():该方法可以将当前的请求和响应传递到过滤链上的下一个资源
				   可能是下一个过滤器,也可能是目标资源

FilterConfig接口
	该接口类型作为Filter接口中的init方法的参数使用
	FilterConfig接口中有一个常用的方法:
		getInitParameter(String name)该方法用来获得过滤器得初始化参数值
		在web.xml中,可以为每一个filter配置需要得初始化参数
		与Servlet得<init-param>类似
		过滤器得初始化参数即可通过FilterConfig中的getInitParameter方法获取。

过滤器总结:

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

监听器
Servlet监听器是Servlet规范中定义的一种特殊类,用于监听

ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中属性发生修改的事件。

监听器分类
按监听对象分类:

1.用于监听应用程序对象(ServletContext)
2.用于监听用户会话对象(HttpSession)
3.用于监听请求消息对象(ServletRequest)

按监听事件分类:

1.监听对象的创建和销毁的事件监听器
2.监听事件属性变更(添加,修改,移除)的监听器。

监听器接口
Servlet API中定义了监听器接口,用来监听不同的事件类型

ServletContextListener:上下文监听器
ServletContextAttributeListener:上下文属性监听器
ServletRequestListener:请求监听器
ServletRequestAttributeListener:请求属性监听器
HttpSessionListener:会话监听器
HttpSessionAttributeListener:会话属性监听器

创建监听器类
创建监听器类,实现监听器接口,在web.xml文件中配置监听器类。


<listener>
	<listener-class>
	监听器类全类名
	</listener-class>
</listener>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值