Servlet的学习和理解

Posted yuyiwang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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) {

            }
            
        }
    }
}

 








































































































































以上是关于Servlet的学习和理解的主要内容,如果未能解决你的问题,请参考以下文章

Servlet的学习和理解

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

学习总结------Servlet的简单理解

JSP学习与理解

带有 servlet 的 jQuery 自动完成 UI 不返回任何数据

理解Servlet和Servlet容器Web服务器等概念