尚硅谷JavaWeb的自学之路一(Servlet-1)

尚硅谷JavaWeb的自学之路一(Servlet-1)

1.Servlet的HelloWorld

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

public class HelloServlet implements Servlet

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

    <!--配置和映射Servlet  -->
     <servlet>
        <!-- Servlet注册的名字 -->
        <servlet-name>helloServlet</servlet-name>
        <!-- Servlet全类名 -->
        <servlet-class>com.atguigu.javaweb.HelloServlet</servlet-class>
     </servlet>
    
     <servlet-mapping>
        <!-- 需要和某一个 Servlet 节点的 servlet-name 子节点一致 -->
        <servlet-name>helloServlet</servlet-name>
        <!-- 映射具体的访问路径:/ 代表当前WEB 应用的根目录 -->
        <url-pattern>/hello</url-pattern>
     </servlet-mapping> 

2.Servlet 容器:运行Servlet、JSP、Filter、等的软件环境。

1).可以用来创建Servlet,并调用Servlet的相关生命周期方法
2).JSP,Filter,Listener,Tag ...

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

1).构造器:只被调用一次,第一次请求Servlet时,创建Servlet的实例,调用构造器。
                      这说明 Servlet是单实例的!     
2).init 方法:只被调用一次,在创建好实例后立即被调用,用于初始化当前的Servlet.
3).service:被多次调用,每次请求都会调用Service方法,实际用于响应请求的。
4).destory:只被调用一次,在当前Servlet所在的WEB应用被卸载前调用,用于释放当前Servlet所占用的资源。

4.load-on-startup 参数:

1).配置在Servlet节点中:

   <servlet>
        <!-- Servlet注册的名字 -->
        <servlet-name>secondServlet</servlet-name>
        <!-- Servlet全类名 -->
        <servlet-class>com.atguigu.javaweb.SecondServlet</servlet-class>
        <!-- 可以指定Servlet被创建的时机 -->
        <load-on-startup>2</load-on-startup>
     </servlet>

2).load-on-startup:

可以指定Servlet被创建的时机,若为负数,则在第一次请求时被创建,若为0或正数,
则在当前WEB应用被Servlet容器加载时创建实例,且数字越小越早被创建。

5.关于servlet-mapping:

1). 同一个Servlet可以被映射到多个URL上,即多个 <servlet-mapping> 元素的<servlet-name>子元素的设置值
可以是同一个Servlet的注册名。

2). 在Servlet映射到的URL中也可以使用 * 通配符,但是只能有两种固定的格式:
一种格式是“*.扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾。

<servlet-mapping>
 <servlet-name>secondServlet</servlet-name>
 <url-pattern>/*</url-pattern>
</servlet-mapping>

OR

<servlet-mapping>
 <servlet-name>secondServlet</servlet-name>
 <url-pattern>*.do</url-pattern>
</servlet-mapping>

注意: 以下的既带 / 又带扩展名的不合法.

<servlet-mapping>
 <servlet-name>secondServlet</servlet-name>
 <url-pattern>/*.action</url-pattern>
</servlet-mapping>

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

1).配置Servlet的初始化参数

<!--配置和映射Servlet  -->
     <servlet>
        <!-- Servlet注册的名字 -->
        <servlet-name>helloServlet</servlet-name>
        <!-- Servlet全类名 -->
        <servlet-class>com.atguigu.javaweb.HelloServlet</servlet-class>
      
        <!-- 配置Servlet的初始化参数,且节点必须在load-on-startup节点的前面 -->
        <init-param>
           <!-- 参数名 -->
           <param-name>user</param-name>
           <!-- 参数值 -->
           <param-value>1230</param-value>
        </init-param>
       
        <init-param>
            <param-name>password</param-name>
            <param-value>1230</param-value>
        </init-param>
       
         <!-- 可以指定Servlet被创建的时机 -->
        <load-on-startup>-1</load-on-startup>
     </servlet>

2).获取初始化参数:

         > getInitParameter(String name):获取指定参数名的初始化参数。
         > getInitParameterNames():获取参数名组成的Enumeration 对象。
        
        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).获取Servlet的配置名称(了解)

       > getServletName()
       
        String servletName=servletConfig.getServletName();
  System.out.println(servletName);

7.ServletContext

1).可以由ServletConfig 获取:

ServletContext servletContext=servletConfig.getServletContext();

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

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

设置初始化参数:可以为所有的Servlet所获取,而Servlet的初始化参数只有那个Servlet可以获取。
 <!-- 配置当前WEB应用的初始化参数 -->
 <context-param>
     <param-name>driver</param-name>
     <param-value>com.mysql.jdbc.Driver</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);
  }
  

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

代码:
String realPath=servletContext.getRealPath("/test.txt");
//不是:D:\javawebworkspace\day_01\WebContent\test.txt
System.out.println(realPath);

③:获取当前WEB应用的名称:
getContextPath()

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

④:获取当前WEB应用的某一个文件对应的输入流。
getResourceAsStream(String path):path的/ 为当前WEB应用的根目录.

代码:
InputStream is2=servletContext.getResourceAsStream("/WEB-INF/classes/jdbc.properties");

⑤:和Attribute 相关的几个方法:

8.GET 请求和 POST 请求:

1).使用GET方式传递参数:

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

2).使用POST方式传递参数:

①. POST 请求方式主要用于向 WEB 服务器端程序提交 FORM 表单中的数据: form 表单的 method 置为 POST
②. 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              --请求体中传递参数.

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

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

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

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

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

2).ServletRequest:封装了请求信息,可以从中获取到任何的请求信息。

①. 获取请求参数:

 > String getParameter(String name): 根据请求参数的名字, 返回参数值.
 若请求参数有多个值(例如 checkbox), 该方法只能获取到第一个提交的值.

 > String[] getParameterValues(String name): 根据请求参数的名字, 返回请求参数对应的字符串数组. 
 
 > Enumeration getParameterNames(): 返回参数名对应的 Enumeration 对象,
 类似于 ServletConfig(或 ServletContext) 的 getInitParameterNames() 方法.

 > Map getParameterMap(): 返回请求参数的键值对: key: 参数名,  value: 参数值, String 数组类型.

②. 获取请求的 URI:

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

③. 获取请求方式:

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

④. 若是一个 GET 请求, 获取请求参数对应的那个字符串, 即 ? 后的那个字符串.

 String queryString = httpServletRequest.getQueryString();
 System.out.println(queryString); //user=111&password=111&interesting=game&interesting=party&interesting=shopping

⑤. 获取请求的 Serlvet 的映射路径 

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

⑥. 和 Attribute 相关的几个方法:

3). HttpServletRequest: 是 SerlvetRequest 的子接口. 针对于 HTTP 请求所定义. 里边包含了大量获取 HTTP 请求相关的方法.
 
4). ServletResponse: 封装了响应信息, 如果想给用户什么响应, 具体可以使用该接口的方法实现.

①. *getWriter():

返回 PrintWriter 对象. 调用该对象的 print() 方法, 将把 print() 中的参数直接打印
到客户的浏览器上.

②. 设置响应的内容类型:

response.setContentType("application/msword");
                     application/msword:word文档

③. void sendRedirect(String location):

请求的重定向. (此方法为 HttpServletResponse 中定义.)

========================================练习题===================================================

在web.xml 文件中设置两个WEB 应用的初始化参数,user,password
定义一个login.html,里面定义两个请求字段:user,password。发送请求到loginServlet
在创建一个LoginServlet,在其中获取请求的user,password。比对其和web.xml文件中定义的请求参数是否一致
若一致,响应Hello:xxx,若不一致,响应Sorry:xxx ,xxx为user.
===============================================================================================

                                                                                                                                                                            有什么不足的地方请求大家指出,互相进步!   
                                                                                                                                                                      在此由衷的感谢尚硅谷的JavaWeb视频学习资源