创建一个Servlet

Servlet是在服务器上运行的小程序,一个Servlet就是一个Java类,并且可以通过“请求-响应”的编程模型来访问这个驻留在服务器内存中的Servlet程序。

 

1.创建一个Servlet 接口的实现类

  1)新建一个Dynamic Web Project 文件

  2)  新建一个包  在包内新建一个java类 

    实现一个接口 implements

    public class HelloServlet implements Servlet

    Servlet+Alt+/ 引入文件

    点击 HelloServlet  Add unimplemented methods

package com.lijian.javaweb;

import java.io.IOException;

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

public class HelloServlet implements Servlet{

@Override
public void destroy() {

System.out.println("destroy...");

}

@Override
public ServletConfig getServletConfig() {

System.out.println("getServletConfig...");

return null;
}

@Override
public String getServletInfo() {

System.out.println("getServletInfo...");

return null;
}

@Override
public void init(ServletConfig config) throws ServletException {

System.out.println("init...");

}

@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("servlet...");

}

public HelloServlet() {
System.out.println("HelloServlet...");
}

}

 

public class HelloServlet implements Servlet

2.在web.xml文件中配置和映射这个Servalet

 引入文件  Ctrl + Shift + F  

  如果报错

  cvc-complex-type.2.3: Element 'web-app' cannot have character [children], because the type's content type is element-  only.
  出错原因为xml头文件中第三行:
  xmlns="http://java.sun.com/xml/ns/javaee"
  改成javaee改为j2ee后解决问题。

 <!--配置和映射Servlet-->
  <servlet>

    <!--Servlet注册的名字-->
    <servlet-name>HelloServlet</servlet-name>

    <!--Servlet的全类名-->
    <servlet-class>servlet.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>

    <!--需要和某一个Servlet 节点的 serlvet-name子节点的文本节点一致-->
    <servlet-name>HelloServlet</servlet-name>

    <!--映射具体的访问路径:、代表当前WEB应用的根目录-->
    <url-pattern>/servlet/HelloServlet</url-pattern>
  </servlet-mapping>
3.Swevlet 容器 : 运行Servlet/jsp/filter等软件环境

  1). 可以创建servlet 并调用servlet的相关生命周期方法.

  2).JSP,Filter,Listener,Tag...

 

4.Servlet 生命周期的方法:以下方法都是由servlet 容器负责调用

  1).构造器:只被调用一次,只有第一个请求servlet 时,创建servlet 的实列,调用构造器.

    说明servlet 的是单实例! (不推荐使用全局变量 ,修改全局变量会有问题)

  2).init方法:只被调用一次.创建好实列后立即被调用,用于初始化当前的servlet.

  3).service:被多次调用 每次请求都会调用servelet 方法.实际用于响应请求.

  4).destroy:只被调用一次,在当前servlet 所在的WEB应用被卸载前调用 用于释放当前servlet所在用的资源

 

  5).load-on-startup 参数:

    1> 配置在servlet 节点中

      <servlet>

          <!--Servlet注册的名字-->
          <servlet-name>HelloServlet</servlet-name>

          <!--Servlet的全类名-->
          <servlet-class>servlet.HelloServlet</servlet-class>

          <load-on-startup>1</load-on-startup>

      </servlet>

    2>load-on-startup: 可以指定servlet 被创建的时机 ,若为负数 则在第一次请求时被创建

            若为正数,则在当前WEB应用被Servlet容器加载创建实列,且数组越小越早被创建

 

6. servlet - mapping

  1> 同意servelt 被映射到多个<servlet - mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名

  2>servlet映射到URL中也可以*通配符,但只能有两种固定队的格式 (*.扩展名,/*)

  <servlet - mapping>

    <servlet-name></servlet-name>

    <url-pattern>/*</url-pattern>

  </servlet - mapping>

   OR

  <servlet - mapping>

    <servlet-name></servlet-name>

    <url-pattern>*.do</url-pattern>

  </servlet - mapping>

  一下不合法

  <servlet - mapping>

    <servlet-name></servlet-name>

    <url-pattern>/*.do</url-pattern>

  </servlet - mapping>

7.ServletConfig:封装了Servlet的配置信息,并且可以获取ServletContext对象

1)获取初始化参数

<servlet>

  <servlet-name>HelloWorld</servlet-name>
  <servlet-class>test.HelloWorld</servlet-class>
  <!-- 配置Servlet的初始化参数,节点必须在load-on-startup节点前面-->
  <init-param>
    <!-- 初始化参数名 -->
    <param-name>user</param-name>
    <!-- 初始化参数值 -->
    <param-value>root</param-value>
  </init-param>
  <init-param>
    <param-name>password</param-name>
    <param-value>1230</param-value>
  </init-param>
  <load-on-startup>0</load-on-startup>
</servlet>

 

2)获取初始化参数:

  > getInitParameter(String name):获取指定参数名的初始化参数

  > getInitParameterNames():获取参数名组成的Rnumberation 对象

  

  String user= servletConfig.getInitParameter("user");
  System.out.println("user:"+user);
  Enumeration<String> names = servletConfig.getInitParameterNames();
  while(names.hasMoreElements()) {
  String name = names.nextElement();
  String value=servletConfig.getInitParameter(name);
  System.out.println("~~:"+name+":"+value);
  }

3). 获取Serlvelt 的配置名称

String servletName = servletConfig.getServletName();

8. ServletContext

  1>可以由ServletConfig获取

  2>对该对象代表当前WEB应用:可以认为ServletContext 是当前WEB应用的大管家,可以获取当前WEB应用的各个信息。

    1.获取当前WEB应用的初始化参数

    设置初始化参数:可以为所有Servlet说获取,而Servlet的初始化参数只用的那个Servlet 可以获取

      <!-- 配置当前WEB应用的初始化参数 -->
      <context-param>
        <param-name>driver</param-name>
        <param-value>lijian</param-value>
      </context-param>

    方法:

    getInitParameter

    getInitParameterNames

  

    代码

    

//获取servletContext对象
ServletContext servletContext = servletConfig.getServletContext();

String driver = servletContext.getInitParameter("driver");

System.out.println("driver:"+driver);

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

}

    2.获取当前WEB应用的某一个文件的绝对路径:服务器上的绝对路劲,而不是部署前的路劲

      getRealPath(String path);

      代码:

      String realPath = servletContext.getRealPath("/note.txt");
      System.out.println(realPath);

    3.获取当前WEB应用的名称

      getContextPath()

      代码

      String contextPath = servletContext.getContextPath();

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

      getResourceAsStream(String path);path 的/为当前WEB应用的根目录、

      代码

        ClassLoader classLoader = getClass().getClassLoader();
        InputStream is = classLoader.getResourceAsStream("");

        InputStream is2 = servletContext.getResourceAsStream("");

    5、和attribute 相关的几个方法:

 

九 GET和POST请求:

  1> 使用GET请求获取参数:

    (1).在浏览器地址栏输入某个URL地址或单机网上一个超链接时,浏览器发出的HTTP请求消息的请求方式为GET请求

    (2).如果网页中的<from>表单元素method设置为GET,浏览器提交FORM表单生成的HTTP请求为GET

    (3).使用GET请求方式给WEB服务器传递参数的格式:

      https://i-beta.cnblogs.com/articles?cateId=1651910

    (4).使用GET方式传递的数据量一般控制在1KB一下

  2>. 使用POST方式传递参数,

    (1).主要用于向WEB服务器提交FORM表单中的数据: form 表单中method 设置为post

    (2).POST方式将各个表单字段元素及数据作为HTTP消息请求的实体内容发送给WEB服务器,传递的数据量要比使用GET传递数据量大得多

      请求体中参数    

 十 如何在servlet中获取信息

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

public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
  System.out.println("servlet...");
}

  ServletRequest :封装请求信息,可以重中获取到任何请求信息

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

 

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

  2>.ServletRequest:

  (1).获取请求参数

      > String getParameter(String name):根据请求参数的名字,返回参数值

        如果请求对象有多个值(checkbox) 该方法只能获取第一个提交的值

      > String[] getParameterValues(String name):根据请求参数的名字,返回请求参数的字符串数组

      > Enumeration getParameterNames():返回参数名对应的 Enumeration 对象,类似于 servletConfig(或servletContext)

      > Map getParameterMap():返回参数名对应的键值对,KEY:键, value:值 String 数组类型

      

Map<String, String[]> map = request.getParameterMap();
for(Map.Entry<String, String[]> entry: map.entrySet()) {
System.out.println(entry.getKey()+Arrays.asList(entry.getValue()));
}

  (2)获取请求的请求方式URI

    

HttpServletRequest httpServletRequest = (HttpServletRequest) request;

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

 

  (3)获取请求的URL

 

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

   (4)获取请求的字符串 GET post(null)

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

  (5)获取servlet的映射路径

 

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

  (6) 和attribute 相关的几个方法:

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

 

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

  (1). getWriter():返回PrintWroter对象。调用该对象的print()方法,將把print()中的参数打印到客户的浏览器上

  代码

// 实际的逻辑是在这里
PrintWriter out = response.getWriter();
out.println("<h1>" + message + "</h1>");

 (2).设置响应的类型

 代码

// 设置响应内容类型
response.setContentType("application/msword");

  (3).void sendRedirect(String location):请求的重新定向(此方法为HttpServletResponse中定义)

-----------------------------------------------------------------

在web.xml文件中设置两个web应用初始化参数, user password。

定义一个 login.html.里面定义两个请求字段:user ,password

在创建一个LoginServlet.在其中获取请求:user ,password

对比期和web.xml文件中定义的请求参数是否一致

若一致,响应Hello:xx,若不一致,响应Sorry:xxx 为user

--------------------------------------------------------

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="loginServlet" method="post">
    
        user:<input type="text" name="username"/>
        password:<input type="password" name="password"/>
        
        <input type="submit" value="submit"/>
    
    </form>
</body>
</html>
login.html
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
    <!-- 配置当前WEB应用的初始化参数 -->
    <context-param>
        <param-name>user</param-name>
        <param-value>admin</param-value>
    </context-param>
    
    <context-param>
        <param-name>password</param-name>
        <param-value>lijian</param-value>
    </context-param>
    
    
    <servlet>
        <servlet-name>loginServlet</servlet-name>
        <servlet-class>com.lijian.javaweb.LoginServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>loginServlet</servlet-name>
        <url-pattern>/loginServlet</url-pattern>
    </servlet-mapping>
    
</web-app>
web.xml
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        // 1. 获取请求参数:username,password
        
        String username = request.getParameter("username");
        
        String password = request.getParameter("password");
        
        
        // 2. 获取当前WEB应用的初始化参数username,password
        
        //获取使用ServletContext对象
//        ServletContext servletContext = getServletConfig().getServletContext();
//        
//        String initUser = servletContext.getInitParameter("user");
//        String initPassword = servletContext.getInitParameter("password");        
        
        String initUser = getServletContext().getInitParameter("user");
        String initPassword = getServletContext().getInitParameter("password");    
        
        // 3. 比对
        PrintWriter out = response.getWriter();
        
        if(initUser.equals(username) && initPassword.equals(password)) {
            out.print("Hello:"+username);
        }else {
            out.print("Sorry:"+username);
        }
        
        // 4. 打印响应字符串.

    }
LoginServlet

 

posted @ 2020-02-24 09:45  野香蕉  阅读(724)  评论(0)    收藏  举报