JavaWeb 后端 <二> 之 Servlet 学习笔记

JavaWeb 后端 <二> 之 Servlet 学习笔记

一、Servlet概述

1、什么是Servlet

Servlet是一个运行在服务器端的Java小程序,通过HTTP协议用于接收来自客户端请求,并发出响应。

2、Servlet中的方法

public void service(ServletRequest req,ServletResponse res)

throws ServletException,java.io.IOException

ServletRequest req:代表着请求对象,该对象中有HTTP协议的请求部分的所有内容。它的实现类由服务器提供的,封装数据也是服务器来做的。

ServletResponse res:代表着响应对象,该对象中由我们写数据(HTTP协议的响应部分)进去。它的实现类也是由服务器提供的。

service:由服务器调用,每次请求都会调用一次。服务器采用的是多线程机制。

二、Servlet的编码步骤

1、编写一个类实现javax.servlet.Servlet接口,或者继承javax.servlet.GenericServlet

2、编译Servlet的源码

3、映射Servlet

修改web.xml

4、把应用部署Tomcat中,访问地址:http://localhost:8080/firstServlet/hello

明确:规范 服务器 应用间的关系

三、Servlet的执行过程

实例 class代码


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

package com.it.Serlvet;

import java.io.IOException;

import javax.servlet.GenericServlet;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

public class SerlvetDemo1 extends GenericServlet {

    @Override

    public void service(ServletRequest req, ServletResponse res)

            throws ServletException, IOException {

        // TODO Auto-generated method stub

        res.getWriter().write("this is yif‘s page ");

    }

}

web 定义及映射

<servlet>
        <!--定义Servlet:给Servlet类取一个名字-->
        <servlet-name>SerlvetDemo1</servlet-name>
        <servlet-class>com.it.Serlvet.SerlvetDemo1</servlet-class>
    </servlet>
    <servlet-mapping>
        <!--映射Servlet:给Servlet一个访问地址-->
        <servlet-name>SerlvetDemo1</servlet-name>
        <url-pattern>/SerlvetDemo1</url-pattern>
    </servlet-mapping>

四、Servlet的编写方式:

1、javax.servlet.GenericServlet:通用的Servlet实现,抽象类

(经常用)2、javax.servlet.http.HttpServlet:与HTTP协议有关的,抽象类

继承HttpServlet,然后覆盖掉doGet或doPost方法即可,不要覆盖掉service方法。

*Servlet规范中的核心接口类图

五、Servlet的生命周期

1、生命周期(必须清晰):诞生--活着--死亡。人有这个过程,内存中的对象也有。

2、Servlet对象的生命周期

l  诞生:用户第一次访问时,由容器创建他的实例。

l  活着:一旦创建就驻留内存(单例)。每次用户的访问,容器都会调用sevice方法发出响应(多线程)

l  死亡:应用被卸载或者Tomcat关闭了

实例:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

public class ServletDemo3 extends HttpServlet { 

    

        //用户第一次访问时,只执行一次

        public ServletDemo3(){

            System.out.println("调用了Servlet的默认构造方法");

        }

        

        //用户第一次访问时,执行一次。用于对象的初始化

        public void init() throws ServletException {

            System.out.println("调用了Servlet的初始化方法");

        }

        

        //每次用户访问都执行

        public void doGet(HttpServletRequest request, HttpServletResponse response)

                throws ServletException, IOException {

            System.out.println("执行了Service方法");

        }

        public void doPost(HttpServletRequest request, HttpServletResponse response)

                throws ServletException, IOException {

            doGet(request, response);

        }

        

        //调用一次。用于清理工作

        public void destroy() {

            System.out.println("调用了Servlet的销毁方法");

        }

}

六、Servlet的线程安全

七、Servlet的一些细节

1、一个Servlet可以被映射到多个地址上

2、可以使用地址通配符*

写法一:*.do结尾 。必须以*开头    比如*.do

写法二(比一优先级略高):以/开头,必须以*结尾     比如/action/*

3、默认的Servlet

默认的Servlet的映射路径是<url-pattern>/</url-pattern>。不需要大家配,因为默认的Servlet负责处理用户的请求URL找不到匹配的处理工作

一切都是Servlet。访问 1.html

4、应用在启动时就完成Servlet的实例化和初始化

八、ServletConfig:Servlet的参数配置

1、ServletConfig:代表着针对当前Servlet的参数配置

2、如何得到ServletConfig对象的引用:在初始化Servlet时,由容器产生,并传递给你

代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

public class ServletDemo5 extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //使用config了

        ServletConfig config = getServletConfig();

        test2(config);

    }

    

    //得到当前Servlet所有的配置参数

        private void test2(ServletConfig config) {

            Enumeration e = config.getInitParameterNames();//参数的名字

            while(e.hasMoreElements()){

                String paramName = (String)e.nextElement();

                System.out.println(paramName+"="+config.getInitParameter(paramName));

            }

        }

        //得到指定名称的参数的值

        private void test1(ServletConfig config) {

            //得到指定名称的参数值

            String value = config.getInitParameter("encoding");

            System.out.println(value);

        }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doGet(request,response);

    }

}

九、ServletContext

1、ServletContext代表着当前应用每个应用只有一个ServletContext对象的实例,由容器提供。

2、如何获取ServletContext的实例:

ServletConfig.getServletContext();

3、ServletContext的生命周期

诞生:应用被加载时就由容器创建好

活着:应用不挂就一直活着

死亡:应用挂了,就挂了

4、域(存活范围)对象:

ServletContext称为应用范围域对象。

可以通过ServletContext 传递 参数


1

2

3

4

5

6

7

8

9

10

public class ServletContextDemo1 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

//      ServletConfig config = getServletConfig();

//      ServletContext sc = config.getServletContext();

        ServletContext sc = getServletContext();

        sc.setAttribute("p""ppp");

        response.getWriter().write("put done");

    }


1

2

3

4

5

6

7

8

public class ServletContextDemo2 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        ServletContext sc = getServletContext();

        String str = (String)sc.getAttribute("p");

        response.getWriter().write(str);

    }

ServletContextDemo1 设置参数 ,ServletContextDemo2取出 共享的 ServletContext 实现数据共享

5、配置应用级的参数web.xml

用ServletContext来取


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

//获取应用级的参数

public class ServletContextDemo3 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        ServletContext sc = getServletContext();

        //得一个参数

//      String value = sc.getInitParameter("encoding");

//      System.out.println(value);

        //得所有的参数

        Enumeration<String> names = sc.getInitParameterNames();

        while(names.hasMoreElements()){

            String paramName = names.nextElement();

            System.out.println(paramName+"="+sc.getInitParameter(paramName));

        }

    }

附:

实现 请求转发


1

2

3

4

5

6

7

8

9

//转发:源

public class ServletContextDemo4 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        ServletContext sc = getServletContext();

        RequestDispatcher rd = sc.getRequestDispatcher("/servlet/ServletContextDemo5");//转发的地址。ServletContext得到的,地址必须以"/"开头,该"/"就代表着当前应用的访问路径/day07_01_servlet

        rd.forward(request, response);//转发

    }


1

2

3

4

5

6

7

//转发:目标

public class ServletContextDemo5 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        response.getWriter().write("I am five");

    }

实现中文文件的下载


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

//实现中文文件的下载

public class ServletContextDemo6 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        //文件在哪儿?以不变应万变

        ServletContext sc = getServletContext();

        String realPath = sc.getRealPath("/WEB-INF/classes/霉女.jpg");//  文件存放的真实绝对路径

//      System.out.println(realPath);

        //构建文件的输入流

        InputStream in = new FileInputStream(realPath);

        //告知客户端以下载的方式打开:Content-Disposition=attachment;filename=27.jpg

        

        //获取要下载的文件名

        

        String filename  = realPath.substring(realPath.lastIndexOf(File.separator)+1);

        

        response.setHeader("Content-Type""application/octet-stream");

        response.setHeader("Content-Disposition""attachment;filename="+URLEncoder.encode(filename,"UTF-8"));//中文属于不安全的字符,需要进行URL编码

        

        //用response的字节流进行输出

        OutputStream out = response.getOutputStream();

        

        int len = -1;

        byte b[] = new byte[1024];

        while((len=in.read(b))!=-1){

            out.write(b, 0, len);

        }

        in.close();

        out.close();

    }

encode 编码

实例: 使用utf-8编码


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

import java.io.UnsupportedEncodingException;

import java.net.URLDecoder;

import java.net.URLEncoder;

import org.junit.Test;

public class UrlEncodeDemo {

    @Test

    public void test1() throws UnsupportedEncodingException{

        String s = "胡轩";

        System.out.println(URLEncoder.encode(s, "UTF-8"));

    }

    @Test

    public void test2() throws UnsupportedEncodingException{

        String s = "%E8%83%A1%E8%BD%A9";

        String v = URLDecoder.decode(s, "UTF-8");

        System.out.println(v);

    }

}

读取配置文件的各种方式


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

//演示:读取配置文件的各种方式

public class ServletContextDemo7 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        test31(request, response);

    }

    //请不要把Tomcat等服务器装在有空格的目录中

    //类加载器读取:只能读取classes或者类路径中的任意资源。但是不适合读取特别大的资源。b c 

    private void test31(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        ClassLoader cl = ServletContextDemo7.class.getClassLoader();//得到类加载器

        URL url = cl.getResource("com/itheima/resources/c.properties");

        String path = url.getPath();

        InputStream in = new FileInputStream(path);

        Properties props = new Properties();

        props.load(in);

        System.out.println(props.getProperty("hello"));

    }

    //类加载器读取:只能读取classes或者类路径中的任意资源。但是不适合读取特别大的资源。b c 

    private void test30(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        ClassLoader cl = ServletContextDemo7.class.getClassLoader();//得到类加载器

//      InputStream in = cl.getResourceAsStream("b.properties");

        InputStream in = cl.getResourceAsStream("com/itheima/resources/c.properties");

        Properties props = new Properties();

        props.load(in);

        System.out.println(props.getProperty("hello"));

    }

    

    //利用ResourceBundle读取:b  c ,不能读a,只能读取properties的文件

    private void test20(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

//      ResourceBundle rb = ResourceBundle.getBundle("b");

        ResourceBundle rb = ResourceBundle.getBundle("com.itheima.resources.c");

        System.out.println(rb.getString("hello"));

    }

    //利用ServletContext读取:a b c

    //可以读取应用中任何位置上的资源。使用限制:只能在web应用中用

    private void test10(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

//      String path = getServletContext().getRealPath("/a.properties");

//      String path = getServletContext().getRealPath("/WEB-INF/classes/b.properties");

        String path = getServletContext().getRealPath("/WEB-INF/classes/com/itheima/resources/c.properties");

        

        InputStream in = new FileInputStream(path);

        Properties props = new Properties();

        props.load(in);

        System.out.println(props.getProperty("hello"));

    }

   

时间: 2024-08-02 11:01:58

JavaWeb 后端 <二> 之 Servlet 学习笔记的相关文章

JavaWeb 后端 &lt;五&gt; 之 JSP 学习笔记

一.JSP简介 1.也是SUN公司推出的开发动态web资源的技术,属于JavaEE技术之一.由于原理上是Servlet, 所以JSP/Servlet在一起. 二.HTML.Servlet和JSP 1.HTML:静态页面,不能包含java代码,只能有HTML有关的标记 2.Servlet:写java代码,做页面的输出,不是很方便(开发效率很低) 3.JSP:HTML+java 三.输出当前的时间 <%@ page language="java" import="java.

SERVLET 学习笔记

SERVLET 学习笔记 一.Servlet基本定义 Servlet是服务器端上面运行的一段小的java程序,一个servlet就是一个简答的java类.通常servlet都是通过请求和返回的模式来被访问的,客户端通过resuest请求,servlet则通过response来返回需要的内容. 二.Tomcat容器等级 Tomcat容器等级分为四个等级,由内向外分别是:context容器àSERVLET容器àHOST(主机)容器àENGINE(引擎)容器.其中,CONTEXT容器,一个CONTEX

Servlet学习笔记(六)—— 自定义过滤器的编写

Boss今天让我写一个类似BBS留言板的过滤器,要求对字符编码.登录权限.敏感词进行过滤操作. 总体分两模块: 一.过滤器 //Filter.java package lewa; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public interface Filter { public void init(); public void doFilter(ServletRequest reu

测试servlet学习笔记

操作方法: 1.新建工程: File-->new-->Java Project-->TestServlet(工程名称)-->Finish. 2.加载servlet-api.jar类包: TestServlet(右键)-->Build Path-->Configure Build Path-->Library -->Add External JAR Selection-->(浏览在tomcat的lib目录下找到servlet-api.jar选中后点击打开

Servlet学习笔记(八)—— 自定义过滤器的编写改进:自定义实现FilterChain

笔记六中实现了三种过滤器:字符编码过滤.登录权限过滤.敏感词过滤,但是有个缺陷就是,限定了过滤顺序,而不能实现先进行request过滤,最后response过滤,并且中间几项过滤的顺序不能动态改变.所以这里做个改进,实现一个过滤顺序的FilterChain. 多个Filter的执行顺序在这篇博文中得到很仔细的讲解,总结一点,多个过滤器的执行顺序是根据web.xml中不同<filter-mapping>的顺序来先后执行的,比如: <?xml version="1.0"

spss C# 二次开发 学习笔记(二)——Spss以及统计术语解释(IT人眼中的统计术语)

针对客户需求,需要对一些数据做统计分析.统计分析的第一步,即为数据查询,查找出要统计分析的数据. 查询得出的是一个行列表格的结果集,行.列.表格等这些IT的数据库概念和Spss以及统计中的术语是如何对应的,这点是刚接触统计这方面的我首先要理清楚的. 变量(Variable)——结果集中的列.可以为数据库表字段,当然也可以使使用函数处理后的,即为表达式. 变量的类型分为字符型和数值型,有长度设置,对于数值有精度设置. 数值型,有数值和数值标签一说,例如性别,如果为字符型,则值为男或者女,如果为数值

spss C# 二次开发 学习笔记(六)——Spss统计结果的输出

Spss的二次开发可以很简单,实例化一个对象,然后启用服务,接着提交命令,最后停止服务. 其中重点为提交命令,针对各种统计功能需求,以及被统计分析的数据内容等,命令的内容可以很复杂,但也可以简单的为一个字符串.命令的获取,可以类似于Office录制宏一样,操作的过程中,Spss输出应用程序会记录命令内容,然后可以参考命令语法手册,去完善命令内容. 而获取输出结果,即获取统计的图.表等内容,功能很强大,当然起初操作起来也有些不可思议.它不是常规的进行统计,然后执行输出命令获取输出结果.Spss的输

spss C# 二次开发 学习笔记(四)——Spss授权

Spss的授权方式有两种,单机版和网络版. Spss的激活,在联网的情况下,通过20位的激活码激活,在未联网的情况下,Spss根据机器获取一个类似4-XXXX的锁定码,然后由激活码和锁定码算出一个授权码,来激活程序. 整个激活过程,可以在IBM网站上处理,申请一个单号,然后注册,然后逐步操作,也可以直接打服务电话,由IBM相关人员帮助处理. 网络版的授权模式为,在证书服务器上安装证书授权管理程序,然后客户机通过证书服务器进行授权,允许在任意客户机上安装Spss并授权,但并发数目收到购买的数量的限

Servlet学习笔记(七)—— JSP概述

1.Servlet两个缺陷: ①所有HTML标签必须包在Java字符串中,使得发送HTTP响应十分繁琐: ②所有文本和HTML标签都必须进行硬编码,即使对表示层做极其微小的修改,也需要重新编译. 2.注释: (1)JSP备注:<% %>,不会发送到浏览器,不能嵌套 (2)HTML备注:<!-- -->,不被容器处理,直接发送到浏览器,用途之一是标识JSP页面.在处理带有许多JSP片段的应用程序时,开发者通过查看HTML源代码,可以轻松查出某个HTML代码部分生成了那个JSP页面.