Servlet的学习和理解(二)

一.ServletContext接口



Servlet引擎为每个WEB应用程序都创建一个对应的ServletContext对象,ServletContext对象被包含在ServletConfig对象中,调用ServletConfig.getServletContext方法可以返回ServletContext对象的应用。
由于每一个WEB应用程序中的所有Servlet都共享同一个ServletContext对象,所以,SevletContext对象被称为application对象(WEB应用程序对象)。



功能:

1.获取web应用程序的初始化参数
        2.记录日志
        3.appliciation域范围的属性
        4.访问资源文件
        5.获取虚拟路径所映射的本地路径
        6.web应用程序之间的访问
        7.ServletContext的其他方法



ServletContext:
1).可以由ServletConfig获取
2).该对象代表当前web应用:可以认为ServletContext是当前WEB应用的一个大管家,可以从中获取当前web应用的各个方面的信息。

2.1获取当前web应用的初始化参数:可以为所有的Servlet所获取,而Servlet的初始化参数只能用那个Servlet可以获取

1 <context-param>
2      <param-name>driver</param-name>
3      <param-value>com.mysql.jdbc.Driver</param-value>
4      </context-param>
5      


方法:
getInitParameter
getinitParameterNames

代码:

ServletContext servletContext=servletConfig.getServletContext();

        String driver=servletConfig.getInitParameter("driver");
        System.out.println("driver"+driver);
        Enumeration<String> names2=servletContext.getInitParameterNames();
        while(names2.hasMoreElements()) {
            String name=names2.nextElement();
            System.out.println("-->"+name);
        }

2.2获取当前WEb应用的某一个文件在服务器上的绝对路径,而不是部署前的路径
getRealPath(String path);

2.3获取WEB应用的名称;
getContextPath()

代码:

String contextPath=servletContext.getContextPath();
System.out.println(contextPath);

2.4获取当前WEB应用的某一个文件对应的输入流

getResourceAssStream(String path):path的/为当前WEB应用的根目录.

代码:

Classloader classLoader=getClass.getClassLoader();
InputStream is2=servletContext.getResourceAssStream("jdbc.properties");
System.out.println("1."+is);("/WEB-INF/classes/jdbc.properties");

自己新建一个jdbc.properties
2.5和atttrubute相关的几个方法



二.Http简介

WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议

HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议集中的一个应用层协议,用于定义web浏览器与WEB服务之间交换 数据的过程以及数据本身的格式。

HTTP协议的版本HTTP/1.0,HTTP/1.1,HTTP-NG



使用GET和POST方式传递参数

在URL地址后面可以附加一些参数

举例:http://www.it1315.org/servlet/ParamsServlet?param1=abc&param2=xyz



GET方式
举例:GET/servlet/param1=abc&param2=xyz HTTP/1.1
特点:传送的数据量是有限制的,一般限制在1kb以下

POST方式
举例:POST/servlet/param1=abc&param2=xyz HTTP/1.1
Host:
Content-Type:appliciation/x-www-form-urlencoded
Context-Length:28

param1=abc&param2=xyz
特点:传送的数据量要比GET方式传送的数据量大得多



Get请求和Post请求:
1).使用GET方式传递参数:
1.1在浏览器地址中输入某个URL地址或单击网页上的一个超链接时,浏览器发出的HTTP请求消息的方式为GET
1.2如果网页中的<form>表单元素中的method属性被设置为"GET",浏览器提交这个FORM表单时生成的HTTP请求消息的请求方式也为GET.
1.3使用GET请求方式给WEB服务器传递参数的格式:
  http://www.atguigu.net/counter.jsp?name&password=123
1.4使用GET方式传送数据量一般限制在1kb以下。

2).使用POST方式传递参数:
2.1 POST请求方式主要向WEB服务器端程序提交FORM表单中的数据:form表单中的method置为POST
2.2 POST方式将各个表单字段元素及其数据作为HTTP消息的实体内容发送给WEB服务器,传送的数据量要比使用GET方式传送的数据量大得多。
POST/counter.jsp HTTP/1.1
referer:http://localhost:8080/Register.html
content-type:application/x-www-form-urlencoded
host:localhost:8080
content-length:43

name=zhangsan&password=123      --请求体重传递参数。



三.如何在Servlet中获取请求信息:



1).Servlet的service()方法用于应答请求:因为每次请求都会调用service()方法。

public void service(ServletRequest request,ServletResponse response)throws ServletException,IOEcxeption

ServletRequest:封装了请求信息,可以从中获取到任何的请求信息
ServletResponse:封装了响应信息,如果想给用户什么响应,具体可以使用该接口的实现方法



2).这两个接口的实现类都是服务器给与实现的,并在服务器调用service方法时传入

ServletRequest:
2.1获取请求参数;
>String getParameter(String name):根据请求参数的名字,返回参数值。
>Map getParameterNames():返回请求参数的键值对:参数名,value:参数值,String数组类型
Enumeration getParameternames():返回参数名对应的Enumeration对象,
类似于ServletConfig(或ServletContext)的getInitParameterNames(方法)。
>String[] get ParameterValues(String name):根据请求参数的名字,返回字符串数组。
若请求参数有多个值(例如checkbox),该方法只能获取到第一个提交的值。

2.2获取请求的URl:
HttpServletRequest httpServletRequest=(HttpServletRequest)request;
        String requestURI=httpServletRequest.getRequestURI();
        System.out.println(requestURI);
        
2.3获取请求方式:

String Method=httpServletRequest.getMethod();
        System.out.println(Method);

2.4若是一个GET请求,获取请求参数对应的那个字符串,就是?后面的那个字符串
String queryString=httpServletRequest.getQueryString();
        System.out.println(queryString);

2.5获取请求的Servlet的映射路径
String servletPath=httpServletRequest.getServletPath();
        System.out.println(servletPath);

2.6和attribute相关的几个方法



3).HttpServletRequest:是ServletRequest的子接口,针对于HTTP请求所定义,里面包含了大量获取HTTP请求相关的方法。



4).
ServletResponse:封装了响应信息,如果想给用户什么响应,具体可以使用该接口的实现方法

4.1 getWriter():返回PrintWriter对象,调用该对象的print()方法,将print()中的参数直接打印到客户的浏览器上。PrintWriter out=reponse.getWriter();
        out.println("hello world...");
4.2 设置响应的内容类型setContextType()
reponse.setContentType("application/msword");

4.3 void sendRedirect(String Location):请求的重定向。(此方法为HttpServletReponse 中定义。)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
练习:在web.xml文件中设置两个WEB应用的初始化参数,user,password.
定义一个login.html,里面定义两个请求字段:user,password
在创建一个LoginServlet,在其中获取请求的user,password。比对其和web.xml文件中定义的请求参数是否一致,若一致,响应hello:xxx,若不一致,响应sorry:xxx  xxx为user.



目录:

web.mxl

<?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_3_0.xsd"
        id="WebApp_ID" version="3.0">

        <servlet>
                <servlet-name>loginServlet</servlet-name>
                <servlet-class>com.yuyi.javaweb.loginServlet</servlet-class>
                <init-param>
                        <param-name>user</param-name>
                        <param-value>root</param-value>

                </init-param>

                <init-param>
                        <param-name>password</param-name>
                        <param-value>123</param-value>
                </init-param>
                <load-on-startup>3</load-on-startup>

        </servlet>

        <servlet-mapping>
                <servlet-name>loginServlet</servlet-name>
                <url-pattern>/loginServlet</url-pattern>
        </servlet-mapping>
</web-app>

login,html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录界面</title>
</head>
<body>
     <form action="loginServlet" method="post">
     user:<input type="text" name="user">
     password:<input type="password" name="password">

     <br><br>
     interesting:
     <input type="checkbox" name="interesting" value="reading"/>Reading
     <input type="checkbox" name="interesting" value="game"/>Game
     <input type="checkbox" name="interesting" value="shopping"/>Shopping
     <input type="checkbox" name="interesting" value="party"/>Party
     <input type="checkbox" name="interesting" value="sport"/>Sport
     <input type="checkbox" name="interesting" value="sing"/>Sing
     <input type="submit" value="Submit">
     </form>
</body>
</html>

loginServlet.java

package com.yuyi.javaweb;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.EnumMap;
import java.util.Enumeration;
import java.util.Map;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class loginServlet implements Servlet{

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public ServletConfig getServletConfig() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public String getServletInfo() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void init(ServletConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }

    @Override
    public void service(ServletRequest request, ServletResponse reponse) throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("请求来了!");
        System.out.println(reponse);

        String user=request.getParameter("user");
        String password=request.getParameter("password");
        System.out.println(user+","+password);

        String interesting=request.getParameter("interesting");
        System.out.println(interesting);

        String[] interestings=request.getParameterValues("interesting");
        for(String intertest:interestings) {
            System.out.println("interesting:"+intertest);
        }

        Enumeration<String> names=request.getParameterNames();
        while(names.hasMoreElements()) {
            String name=names.nextElement();
            String val=request.getParameter(name);
            System.out.println(val);
        }
        Map<String,String[]>map=request.getParameterMap();
        for(Map.Entry<String, String[]>entry:map.entrySet()) {
            System.out.println(entry.getKey()+":"+Arrays.asList(entry.getValue()));
        }

        HttpServletRequest httpServletRequest=(HttpServletRequest)request;
        String requestURI=httpServletRequest.getRequestURI();
        System.out.println(requestURI);

        String Method=httpServletRequest.getMethod();
        System.out.println(Method);

        String queryString=httpServletRequest.getQueryString();
        System.out.println(queryString);

        String servletPath=httpServletRequest.getServletPath();
        System.out.println(servletPath);

        reponse.setContentType("application/msword");

        PrintWriter out=reponse.getWriter();
        out.println("hello world...");

    }

}


四.GenericServlet(了解)



1).是一个Servlet.是Servlet接口和ServletConfig接口的实现类,但是一个抽象类,其中的service方法为抽象方法
2).如果新建的Service程序直接继承GenericsServlet会使开发更简洁
3.1.在GenericServlet声明了一个ServletConfig类型的成员变量,在init(ServletConfig)方法对其初始化
3.2利用servletConfig成员变量的方法实现了ServletConfig接口的方法
3.还定义了一个init(Config)方法,在init(ServletConfig)方法对其调用,子类可以直接覆盖init()在其中实现对Servlet的初始化
4.不建议直接覆盖init(ServletConfig),因为如果忘记编写super(ServletConfig),还是用了ServletConfig接口的方法,则会出现空指针异常
3.5新建的init{}并非Servlet的生命周期方法,而intit(ServletConfig)是生命周期相关的方法.


package com.yuyi.ServletTest;

import java.io.IOException;
import java.util.Enumeration;

/**
 * 自定义的一个Servlet接口实现类,让任何开发Servlet继承该类,以简化开发
 */

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public abstract class MyGenericServlet implements Servlet,ServletConfig{

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public ServletConfig getServletConfig() {
        // TODO Auto-generated method stub
        return ServletConfig;
    }

    @Override
    public String getServletInfo() {
        // TODO Auto-generated method stub
        return null;
    }

    private ServletConfig ServletConfig;
    @Override
    public void init(ServletConfig arg0) throws ServletException {
        this.ServletConfig=arg0;
    }

    @Override
    public abstract void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException ;
/** 以下方法为ServletConfig接口的方法**/
    @Override
    public String getInitParameter(String arg0) {
        // TODO Auto-generated method stub
        return ServletConfig.getInitParameter(arg0);
    }

    @Override
    public Enumeration<String> getInitParameterNames() {
        // TODO Auto-generated method stub
        return ServletConfig.getInitParameterNames();
    }

    @Override
    public ServletContext getServletContext() {
        // TODO Auto-generated method stub
        return ServletConfig.getServletContext();
    }

    @Override
    public String getServletName() {
        // TODO Auto-generated method stub
        return ServletConfig.getServletName();
    }

}


2.HttpServlet:
1).是一个Servlet,继承自Genericservlet.针对于Http协议所定制。
2).在service()方法中直接把ServletRequest和ServletReponse转为HttpRequest和HttpReponse
并调用了重载的service(HttpRequest,HttpReponse)
在service(HttpRequest,HttpReponse)获取了请求方式:request.getMethod().
doxxx() 方法(xxx 为具体的请求方式,比如doGet,doPost)



代码:

public class MyHttpServletRequest extends MyGenericServlet{

    @Override
    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
        if(arg0 instanceof HttpServletRequest) {
            HttpServletRequest request=(HttpServletRequest)arg0;

            if(arg1 instanceof HttpServletResponse) {
                HttpServletResponse response=(HttpServletResponse)arg1;
                service(arg0, arg1);
            }
        }
    }
    public void service(HttpServletRequest request,HttpServletResponse reponse) throws ServletException,IOException{
        //1.获取请求方式。
        String method=request.getMethod();
        //2.根据请求方法再调用对应的处理
方法
        if("GET".equalsIgnoreCase(method)) {
            doGet(request,reponse);
        }
        else if("POST".equalsIgnoreCase(method)) {
            doPost(request,reponse);
        }
    }
    private void doPost(HttpServletRequest request, HttpServletResponse reponse) {
        // TODO Auto-generated method stub

    }
    private void doGet(HttpServletRequest request, HttpServletResponse reponse) {
        // TODO Auto-generated method stub

    }
}


3).实际开发中,直接继承httpServlet,并根据请求方式复写doxxx()方法接口
4).好处:直接由针对的覆盖doxxx方法;直接使用HttpServletrequest和Httpreponse,不需要强转。



在MySQl数据库创建一个test_users数据表,添加三个字段
定义一个login.html,里面定义两个请求字段:id,user,password.并录入几条记录user,password
在创建一个LoginServlet(需要继承自HttpServlet,并重写doPost方法),在其中获取请求的user,password。利用JDBC从test_user中查询有没有和页面输入的user,password对应的记录,
SELECT count(id) FROM test_users WHERE user=?
若有,响应Hello:xxx,若不一致,响应sorry:xxx  xxx为user.



 1.数据库的话就自己建立

2.目录

3.web.xml

<?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_3_0.xsd"
        id="WebApp_ID" version="3.0">
        <!-- 初始化参数 -->
        <context-param>
                <param-name>user</param-name>
                <param-value>root</param-value>
        </context-param>

        <context-param>
                <param-name>password</param-name>
                <param-value>123456</param-value>
        </context-param>

        <!-- 配置servlet -->
        <servlet>
        <servlet-name>loginServlet3</servlet-name>
        <servlet-class>  com.yuyi.ServletTest.loginServlet3</servlet-class>
        </servlet>
        <servlet-mapping>
        <servlet-name>loginServlet3</servlet-name>
        <url-pattern>/loginServlet3</url-pattern>
        </servlet-mapping>
</web-app>

 4.login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录界面</title>
</head>
<body>
        <form action="loginServlet3" method="post">
        user:<input type="text" name="username"/>
        password:<input type="password" name="password"/>
        <input type="submit" value="Submit"/>
        </form>
</body>
</html>

5.loginServlet3.java

package com.yuyi.ServletTest;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import java.sql.Connection;
import java.sql.PreparedStatement;

public class loginServlet3 extends HttpServlet{
    @Override
    protected void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException {
        String username=request.getParameter("username");
        String password=request.getParameter("password");

        Connection connection=null;
        PreparedStatement statement=null;
        ResultSet resultSet=null;

        PrintWriter out=response.getWriter();
        String sql="SELECT  count(id)from users WHERE username=?"+"AND password=?";

        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url="jdbc:mysql://localhost:3306/test";
            String user="root";
            String password2="628081abc";
            connection=(Connection) DriverManager.getConnection(url,user,password2);

            statement=(PreparedStatement) connection.prepareStatement(sql);
            statement.setString(1, username);
            statement.setString(2, password);

            resultSet=statement.executeQuery();

            if(resultSet.next()) {
                int count=resultSet.getInt(1);

                if (count>0) {
                    out.println("Hello,"+username);
                }else {
                    out.println("sorry,"+username);
                }
            }

        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(resultSet!=null) {
                    resultSet.close();
                }
            }catch(SQLException e){
                e.printStackTrace();
            }

            try {
                if(statement!=null) {
                    statement.close();
                }
            } catch (SQLException e) {

            }

            try {
                if(connection!=null) {
                    connection.close();
                }
            } catch (SQLException e) {

            }

        }
    }
}

原文地址:https://www.cnblogs.com/yuyiWang/p/9383929.html

时间: 2024-10-05 11:12:16

Servlet的学习和理解(二)的相关文章

javaweb回顾第一篇servlet的学习和理解

前言:关于servlet相信学过java的都不会陌生,我最近又把这些基础知识整理一遍,便于自已能更好的理解ssm或者ssh,下面开始 1:Servlet接口 servlet有5个方法下面分别简单的介绍每个方法的作用 1.1:public void init(ServletConfig config) 在servlet被实例化以后,servlet容器会调用init方法来初始化该对象,这个方法主要是完成在请求前的一些初始化工作,比喻调用数据库连接,实例化对象等 1.2:public void ser

基础知识回顾第一章servlet的学习和理解

前言:关于servlet相信学过java的都不会陌生,我最近又把这些基础知识整理一遍,便于自已能更好的理解ssm或者ssh,下面开始 1:Servlet接口 servlet有5个方法下面分别简单的介绍每个方法的作用 1.1:public void init(ServletConfig config) 在servlet被实例化以后,servlet容器会调用init方法来初始化该对象,这个方法主要是完成在请求前的一些初始化工作,比喻调用数据库连接,实例化对象等 1.2:public void ser

#HTTP协议学习# (十二)理解转发与重定向

本文转自:http://blog.csdn.net/meiyalei/article/details/2129120  生动清晰 解释一 转发是服务器行为,重定向是客户端行为.为什么这样说呢,这就要看两个动作的工作流程: 转发过程:客户浏览器发送http请求---->web服务器接受此请求-->调用内部的一个方法在容器内部完成请求处理和转发动作---->将目标资源发送给客户:在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的r

【Java学习笔记之二十六】深入理解Java匿名内部类

在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意的事项.如何初始化匿名内部类.匿名内部类使用的形参为何要为final. 一.使用匿名内部类内部类 匿名内部类由于没有名字,所以它的创建方式有点儿奇怪.创建格式如下: new 父类构造器(参数列表)|实现接口() { //匿名内部类的类体部分 } 在这里我们看到使用匿名内部类我们必须要继承一个父类或者

Servlet的学习(二)

本篇接上一篇<Servlet的学习(一)>,讲述如何利用MyEclipse来创建web工程, 同时讲述如何在MyEclipse中配置Tomcat服务器. 在MyEclipse中,新建“Web Project”,会看到: 我们需要注意的有以下几点: [Project Name]:工程名,代表了这个web应用所在目录名,当在服务器中发布这个web应用时,在Tomcat的[webapps]目录下,就会产生这个目录,所以对于截图来说,就会有一个[myservlet]目录. [Source folder

【java项目实战】Servlet详解以及Servlet编写登陆页面(二)

Servlet是Sun公司提供的一门用于开发动态web网页的技术.Sun公司在API中提供了一个servlet接口,我们如果想使用java程序开发一个动态的web网页,只需要实现servelet接口,并把类部署到web服务器上就可以运行了. 到底什么是Servlet呢? 通俗一点,只要是实现了servlet接口的java程序,均称Servlet.Servlet是由sun公司命名的,Servlet = Server + Applet(Applet表示小应用程序),Servlet是在服务器端运行的小

Unix文件系统学习笔记之二: 文件描述符、inode和打开文件表

Unix文件系统学习笔记之二: 文件描述符.inode和打开文件表 系统盘上数据的布局 文件系统无非是关于数据在磁盘上的组织以及存储空间管理的,为此,首先需要知道磁盘上数据的总体布局方式.以Unix为例,最重要的一张表如下: Unix 进程管理中和用户文件.io 最相关的数据结构:usr 数据结构 The procstructure does not record information related to file access.  However the userstructure con

Servlet的学习(四)

在本篇的Servlet的学习中,主要来学习由使用MyEclipse来开发Servlet的一些小细节. 细节一:在web.xml中可以对同一个Servlet配置多个对外访问路径,并如果在web.xml中配置的信息服务器会自动加载部署,而如果是在Servlet中进行程序代码的修改,则每次都要重新部署. 首先,在使用MyEclipse创建Servlet后,会根据所创建的Servlet进行到web.xml文件的映射,如下图所示: 经过这个映射之后,在web.xml文件中就自动生成了这个Servlet的配

《语义网基础教程》学习笔记(二)

二.RDF概述(参考http://zh.transwiki.org/cn/rdfprimer.htm) 1.本体: 一个本体是一个概念体系(conceptualization)的显式的形式化规范. 一般来说,一个本体形式地刻画一个论域.一个典型的本体由有限个术语及它们之间的关系组成. ★在万维网这个环境中,本体提供了对给定领域的一种共识.这种共识对于消除术语差别是必要的. 通过把各自的术语差异映射到一个公共的本体之间的直接映射,可以消除这些术语差异. 不管采用哪种方案,本体都支持语义可共用性(s