学习路线尚硅谷JavaWeb—Servlet

通过自学尚硅谷的javaweb,学到了Servlet,现在将学到的一些知识和自己的一些总结放在scdn上,希望对你有所帮助 ,有什么不好、不对、落后的知识点,或者我这里面没有写到的,希望你能帮我指出。

2.5Servlet

2.5.1Servelet简介

1、Servlet是javaEE规范之一。规范就是接口

2、Servlet是javaweb三大组件之一。三大组件为:Servlet程序、Filter过滤器、Listener监听器

3、Servlet是运行在服务器上的java的小程序,它可以接受客户端发送过来的请求,并响应给客户端

2.5.2手动实现Servelet

1、编写一个类实现Servlet接口

2、实现service方法,处理请求,并响应数据

 /**
     * doGet()在get请求的时候调用
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("helloSerlvet的get请求");
        ServletConfig servletConfig = getServletConfig();
        System.out.println("HelloServlet程序的别名是:"+servletConfig.getServletName());
//        2、	获取初始化参数init-param
        System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("username"));
        System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("url"));
//        3、	获取ServletContext对象
        System.out.println(servletConfig.getServletContext());
    }
    /**
     * doGet()在Post请求的时候调用
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("helloSerlvet的post请求");
    }

3、到web.xml中去配置Servlet程序的访问地址

<servlet>

<servlet-name>类名</servlet-name>

<servlet-class>全类名</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>Servlet类名</servlet-name>

<url-pattern>/与类名对应关系</url-pattern>

</servlet-mapping>

 <!--servlet标签给Tomcat配置servlet程序 -->
    <servlet>
        <!--servlet-name标签给Servlet程序起别名(一般是类名) -->
        <servlet-name>HelloServlet</servlet-name>
        <!--servlet-class标签是Servlet程序的全类名 -->
        <servlet-class>com.sakura.Servlet.HelloServlet</servlet-class>
        </servlet>
    <!--servlet-mapping标签给servlet程序配置访问地址-->
    <servlet-mapping>
        <!--servlet-name标签的作用是告诉服务器,我档期配置的地址是给那个Servlet程序使用 -->
        <servlet-name>HelloServlet</servlet-name>
        <!--url-pattern标签配置访问地址
         /  斜杠在服务器解析过程时,表示地址为http://ip:port/工程路径
         /hello     表示地址为http://ip:port/工程路径/hello
         -->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    
    <servlet>

4、将Tomcat中的工程路径修改掉,不然jsp无法显示内容,修改成工程名

5、在浏览器中,显示的jsp页面的http后加上设置的url-pattern名,则会出现结果

2.5.3Servlet-url地址定位到Servlet程序图解

2.5.3Servlet生命周期

1、执行Servlet构造器方法

public class HelloServlet implements Servlet {
    public HelloServlet() {
        System.out.println("1构造器方法");
    }

2、执行init初始化方法

第1、2步,是在第一次访问的时候创建Servlet程序会调用

  @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("2init初始化方法");
//        1、	可以获取Servlet程序的别名servlet-name的值
        System.out.println("HelloServlet程序的别名是:"+servletConfig.getServletName());
//        2、	获取初始化参数init-param
        System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("username"));
        System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("url"));
//        3、	获取ServletContext对象
        System.out.println(servletConfig.getServletContext());


    }

3、执行service方法

第三步,每次访问都会被调用

  1. 执行destroy销毁方法

第四步,在web工程停止的时候调用

2.5.4请求的分发处理

在idea中可以直接生成servlet,

1、因为html中存在表单,需要有提交方法,get和post,为了得到提交方式,在

Servlet构造器中,实现HttpServletRequest方法得到getMethod()方法,在控制台输出提交方式:

 /**
     * service方法是专门用来处理请求和响应的
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("3service方法");
        //类型转换 (因为它有getMethod()方法)
        HttpServletRequest httpServletRequest=(HttpServletRequest) servletRequest;
        //获取请求方式
        String method=httpServletRequest.getMethod();
        //System.out.println(method);//GET|POST
        if("GET".equals(method)){
            doGET();
        }else if("POST".equals(method))
            doPOST();

    }

2、通过继承HttpServlet实现Servlet程序

①编写一个类去继承HttpServlet类

    • 根据业务需要重写doGet或doPost方法,通过alt+insert
    •   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              System.out.println("helloSerlvet的get请求");}
       @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              System.out.println("helloSerlvet的post请求");
          }

    • 到web.xml中的配置Servlet程序的访问地址

2.5.5Servlet类的继承体系

自定义Servlet程序—继承—>HttpServlet—继承—>GenericServlet—实现接口—>Servlet

Servlet接口:只是负责实现Servlet程序的访问规范。

GenericServlet:实现了Servlet接口。做了很多空实现。并持有一个ServletConfig类的引用。并对ServletConfig的使用做了一些方法。

HttpServlet抽取类:实现了service()方法,并实现了请求的分发的处理

              String method=req.getMethod();

会获得GET(doGet())  POST(doPost())——>这两个方法负责抛异常,说不支持GET/POST请求

自定义的Servlet程序:我们只需要根据自己的业务需要去重写doGet和doPost方法即可(重写doGet和doPost)

2.5.6ServletConfig类

ServletConfig类时Servlet程序的配置信息类

对于ServletConfig的补充说明,当子类重写了init()方法后,若在Servlet类中调用了ServletConfig但是并没有在init()中实现ServletConfig,则会报空指针异常,所以需要在init中重写父类的方法(super(config))

Eg:当在doGet中调用了getServletConfig()方法,并想调用Servletconfig的方法则只能获得Servlet的别名以及值,而参数列表返回值都为null

而当重写了init()方法时并且没有super父类时,则会报空指针异常

 

Servlet程序和ServletConfig对象都是有Tomcat负责创建,我们负责使用。

Servlet程序默认是第一次访问的访问的时候创建,ServletConfig是每个Servlet程序创建时,就创建一个对应的ServletConfig对象

ServletConfig的三个作用

  1. 可以获取Servlet程序的别名servlet-name的值

//        1、	可以获取Servlet程序的别名servlet-name的值
        System.out.println("HelloServlet程序的别名是:"+servletConfig.getServletName());

2.获取初始化参数init-param:可在web.xml中设置多个参数

//        2、	获取初始化参数init-param
        System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("username"));
        System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("url"));

3.获取ServletContext对象

//        3、	获取ServletContext对象
        System.out.println(servletConfig.getServletContext());

完整方法代码为:

 @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("2init初始化方法");
//        1、	可以获取Servlet程序的别名servlet-name的值
        System.out.println("HelloServlet程序的别名是:"+servletConfig.getServletName());
//        2、	获取初始化参数init-param
        System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("username"));
        System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("url"));
//        3、	获取ServletContext对象
        System.out.println(servletConfig.getServletContext());


    }

最后结果显示:

2.5.7ServletContext类

ServletContext是一个接口,它表示Servlet上下文对象,并且一个web工程只有一个ServletContext对象实例。

ServletContext对象是一个域对象。

ServletContext是在web工程部署启动的时候创建的,在web工程停止的时候被销毁。

域对象:是可以像Map一样存储数据的对象,域是存储数据的操作范围。

              存储数据          取数据               删除数据

Map           put()             get()                remove()

域对象        setAttribute()    getAttribute()    removeAttribute()

  1. ServletContext类的作用
ServletContext servletContext = getServletConfig().getServletContext();
  1. 获取web.xml中配置的上下文参数context-param

可以在web.xml可以写多个context-param

  <!--context-param是上下文参数(它属于整个web工程) -->
    <context-param>
        <!--param-name参数名 -->
        <param-name>username</param-name>
        <!--param-value参数值 -->
        <param-value>context</param-value>
    </context-param>
    <context-param>
        <param-name>password</param-name>
        <param-value>root</param-value>
    </context-param>
//        (1)	获取web.xml中配置的上下文参数context-param
        ServletContext servletContext = getServletConfig().getServletContext();
        String username = servletContext.getInitParameter("username");
        System.out.println("Context-param参数的username的值是"+username);
        String password = servletContext.getInitParameter("password");
        System.out.println("Context-param参数的password的值是"+password);
 
  1. 获取当前的工程路径 http://ip:port//工程路径
//        (2)	获取当前的工程路径	http://ip:port//工程路径
        System.out.println("当前工程路径:"+servletContext.getContextPath());
  1. 获取工程部署后在服务器硬盘上的绝对路径

会直接映射到idea下的web目录

//        (2)	获取当前的工程路径	http://ip:port//工程路径
        System.out.println("当前工程路径:"+servletContext.getContextPath());
//        (3)	获取工程部署后在服务器硬盘上的绝对路径,映射到IDEA的web目录
        System.out.println("工程部署的路径是:"+servletContext.getRealPath("/"));
        System.out.println("工程下css目录的绝对路径是:"+servletContext.getRealPath("/css"));

像Map一样存储数据

  1. //        (4)	像Map一样存储数据
            servletContext.setAttribute("key1","value");
            System.out.println("servletContext的获取域数据key1的"+servletContext.getAttribute("key1"));
            System.out.println("servletContext的获取域数据key1的"+servletContext.getAttribute("servletContext_1"));

说明:因为整个web工程下只会存在一个ServletContext实例,则在web中不管创建了多少个ServletContext,它们的地址都是相同的,通过get和setAttribute设置和获得的值都是一样的,但是当我们停止了或者重启了Tomcat,则ServletContext实例也会被销毁,只有再次启动重新setAttribute可以再次为ServletContext赋值

2.5.8Http协议

协议:指双方或多方,相互约定好,大家都需要遵守的规则。

Http协议:客户端和服务器之间通信是,发送的数据,需要遵守的规则。

Http协议传输的数据叫做报文。

1、请求的Http协议格式

    (1)客户端给服务器发送数据叫请求,服务器给客户端回传数据交响应

    (2)请求分为GET请求和POST请求

1.1 GET请求

    ①请求行

(1)请求的方式             GET

(2)请求的资源路径[+?+请求参数]

(3)请求的协议的版本号     HTTP/1.1

    ②请求头

Key:value    组成   不同的键值对,表示不同的含义

1.2 POST请求

①请求行

(1)请求的方式             POST

(2)请求的资源路径[+?+请求参数]

(3)请求的协议的版本号     HTTP/1.1

②请求头

    1. Key:value     组成   不同的键值对,表示不同的含义

空行

③请求体

就是发送给服务器的数据

1.3 常用请求头的说明

Accept:表示客户端可以接收的数据类型

Accept-Language:表示客户端可以接受的语言类型

User-Agent:表示客户端浏览器的信息

Host:表示请求时的服务器ip和端口号

2.5.9  GET请求和POST请求分类

GET请求

  1. form标签的 method=get
  2. a标签
  3. link标签引入css
  4. Script标签引入js文件
  5. img标签引入图片
  6. iframe引入html页面
  7. 在浏览器地址栏中输入地址后敲回车

POST请求

  1. form标签 method=post

2.5.10    响应的HTTP协议格式

1、响应行

(1)响应的协议和版本号         HTTP/1.1

(2)响应状态码                 200

(3)响应状态的描述符           ok

2、响应头

(1)key:value   不同的响应头,有不同的含义

空行

3、响应体

就是回传给客户端的数据

常见的响应码的说明

200 表示请求成功  302 表示请求重定向   

404 请求服务器已经收到了,但是你要的数据不存在(请求地址错误)

500 表示服务器已经收到请求,但是服务器内部错误(代码错误)

2.5.11    MIME类型说明

MIME是HTTP协议中数据类型

MIME的英文全程是“Multipurpose Internet Mail Extension”多功能Internet邮件扩充服务。MIME类型的格式是“大类型/小类型”,并与某一种文件的扩展名相对应

2.5.12    HttpServletRequest类

1、作用:每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中。然后传递到service方法(doGet和doPost)中给我们使用。我们可以通过HttpServletRequest对象,获取到所用请求的信息。

2、常用方法:

(1)getRequestURI()        获取请求的资源路径

System.out.println("URI=>"+req.getRequestURI());

(2)getRequestURL()        获取请求的统一资源定位符(绝对路径)

System.out.println("URL=>"+req.getRequestURL());

(3)getRemoteHost()        获取客户端的IP地址

使用localHost访问时,得到的客户端ip地址是:0:0:0:0:0:0:0:1(ipV6的地址)

使用127.0.0.1访问时,得到的客户端ip地址是:127.0.0.1

使用真实ip访问时,得到的客户端ip地址是:真实的客户端ip地址

System.out.println("客户端的IP地址"+req.getRemoteHost());

(4)getHeader()            获取请求头

System.out.println("请求头User-Agent=>"+req.getHeader("User-Agent"));

(5)getparameter()         获取请求的参数

(6)getParameterValues()   获取请求的参数(多个值的时候使用)

首先先配置web.xml文件,然后在写好表单,需要的内容。

req.setCharacterEncoding("utf-8");
        //        getparameter()			获取请求的参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String[] hobby = req.getParameterValues("hobby");

        System.out.println("用户名"+username+"密码"+password+"爱好"+ Arrays.asList(hobby));
//        getParameterValues()	获取请求的参数(多个值的时候使用)
获得表单中响应name的属性,最后由服务器返回值
 

 

当hobby使
则这个时候需要改成req.getParameterValues(),hobby也需要改成一个String类型的数组,最后用Arrays.asList(hobby)
补充问题:
在提交方式为get时,username为中文和英文都可以直接通过编译
而当提交方式为post时,username为英文可以通过,而为中文时则会直接405或者通过编译但是是乱码,这个时候需要在继承HttpServlet的doPost方法中使用req.setCharaterEncoding("utf-8")这样才能将信息发送至服务器或是编译通过。
req.setCharacterEncoding("utf-8");
此方法需要在请求参数之前调用,否则就会出现中文乱码的问题

(7)getMethod()            获取请求的方式GET或POST

System.out.println("获取请求的方式=>"+req.getMethod());

(8)setAttribute(key,value)设置域数据

(9)getAttribute(key)      获取域数据

(10)getRequestDispatcher()获取转发对象

用的是req.getParameter()方法时为多选框,当爱好多选是,则只能获得第一个的选项

今天累了,明天继续更新

剩余部分的链接:javaWeb学习路线——Servlet(2) 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

物理变化

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值