servlet专题

来源:互联网 发布:巴恩斯数据 编辑:程序博客网 时间:2024/05/16 08:00
servlet的介绍
    1.servlet其实就是Java程序(Java类)
    2.该Java程序(Java类)遵循servlet开发规范
    3.servlet是运行在服务器端
    4.servlet功能强大几乎可以完成网站的所有功能
    5.是学习jsp基础

servlet的快速入门案例
    1.实现servlet接口
        package servlet1;

    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 MyServlet implements Servlet{

     /*销毁该servlet,从内存中清除,该函数被调用一次*/
     public void destroy() {
      // TODO Auto-generated method stub
 
     }

 /*得到servletconfig对象*/
 public ServletConfig getServletConfig() {
  // TODO Auto-generated method stub
  return null;
 }

     /*该函数是得到servlet配置信息*/
     public String getServletInfo() {
      // TODO Auto-generated method stub
      return null;
     }

 /*用于初始化servlet,就是把servlet装载到内存中,该函数只会被调用一次*/
 public void init(ServletConfig arg0) throws ServletException {
  // TODO Auto-generated method stub
 
 }

 /*该函数是服务函数,我们的业务逻辑代码就是写在这里,该函数每次都会被调用*/
 public void service(ServletRequest arg0, ServletResponse arg1)
   throws ServletException, IOException {
  // TODO Auto-generated method stub
 
 }

}
    2.继承HttpServlet
        当一个servlet类继承了HttpServlet类的时候,那么久要重写他的doget和dopost方法
        package servlet1;

import java.io.IOException;

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

public class MyServlet2 extends HttpServlet{
 
 @Override
 public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  // TODO Auto-generated method stub
  super.doGet(req, resp);
 }
 @Override
 public  void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  // TODO Auto-generated method stub
  super.doPost(req, resp);
 }

}
   
    步骤:
        web.xml中部署servlet
        <?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">

  <display-name>books</display-name>

  <welcome-file-list>

    <welcome-file>index.html</welcome-file>

  </welcome-file-list>

  <!-- 根据servlet规范,需要将servlet部署到web。XML文件 -->

  <servlet>

       <!-- servlet的类名 -->

           <servlet-name>MyServlet</servlet-name>

       <!-- servlet类的全路径 -->

           <servlet-class>com.sxt.MyServlet</servlet-class>

  </servlet>

  <!-- servlet的映射 -->

      <servlet-mapping>

           <!-- 这个servlet-name要与上面的servlet名字一样 -->

           <servlet-name>MyServlet</servlet-name>

            <!-- servlet的访问路径-->

           <url-pattern>/MyServlet</url-pattern>

  </servlet-mapping>
 <servlet-mapping>

           <servlet-name>MyServlet</servlet-name>

           <url-pattern>/hhh</url-pattern>

  </servlet-mapping>


</web-app>
注意:一个注册好的servlet可以多次进行映射(如上述红体代码)

面试题:请简述servlet的生命周期(工作流程)
        servlet被web服务器调用
解:当servlet第一次被调用的时候,会触发init函数,该函数会把servlet实例装载到内存,init函数只被调用一次
        然后会调用servlet的service方法(函数),
        当第二次访问该servlet的时候就直接调用service函数
        当web应用reload或者关闭tomcat,都回去调用distory函数,该函数就回去销毁servlet

       知识点:form表单提交数据 get和post的区别
        1.从安全性看,get<post,get提交的数据会在浏览器的地址栏显示
          2.从提交内容的大小看,get提交的数据不能大于2K,而post提价的数据理论上不受限制
            但实际编程中建议不要大于64K
          3.从请求相应速度上看,get>post,get要求服务器立即处理请求,而post请求可能形成一个队列请求
servlet细节
        Servlet单例问题
            当servlet被第一次访问后,就被加载到内存,以后该实例对各个请求服务,即在使用中是单例
            因为servlet是单例,所以会出现线程安全问题   比如:
            售票系统   如果不加同步机制 ,则会出现为题

         这里有一个原则:
                    (1)如果一个变量需要多个用户共享,则应在访问该变量的会后加上同步机制
                       写法:  synchronized (对象/也可以直接写this) {//同步机制
                                               //同步代码
                                              }
                     (2)如果一个变量不需要共享,则直接在doget(),或者dopost()中定义

                      (3)servlet中的<load-on-satrtup>配置,(配置了<load-on-satrtup>后就可以不需要进行
                                <servlet-mapping>映射
                            需求:当我们的网站启动的时候,可能会要求初始化一些数据(比如创建临时表)
                            再比如我们的网站有一些要求定时完成的任务(定时写日志,定时备份数据,定时发送邮件)
                            
                            解决方法:可以通过<load-on-satrtup> 配合线程知识完成
                             先说明<load-on-satrtup>:通过配置<load-on-satrtup>可以使某个servlet自动创建


 例:模拟定时发送电子邮件
        1.遍写一个线程:EmailThread
            package servlet1;
        public class EmailThread extends Thread{//继承Thread类,重写它的run方法
 
             public void run() {
              int i =0;
                  try {
                   while (true) {
   
                    Thread.sleep(10*10000);//每间隔10秒钟,发送一个邮件
                    System.out.println("这是发送的第"+(++i)+"份邮件");
                   }
               } catch (InterruptedException e) {
                       e.printStackTrace();
          }
     }
}

        2.编写一个servlet类 :EmailServlet

     package servlet1;
    import java.io.IOException;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
public class EmaiServlet extends HttpServlet {
     private static final long serialVersionUID = 1L;
       
        public EmaiServlet() {
            super();
       }
         public void init(ServletConfig config) throws ServletException {
              //创建一个线程
              EmailThread   email = new EmailThread();
              email.start();//打开线程
         }
     public void doGet(HttpServletRequest request, HttpServletResponse response) throws                                ServletException, IOException {
  response.getWriter().append("Served at: ").append(request.getContextPath());
     }
     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
  doGet(request, response);
 }
}
        3.在web.XML中的配置
             <servlet>
                   <!-- servlet的类名 -->
                       <servlet-name>MyServlet</servlet-name>
                   <!-- servlet类的全路径 -->
                       <servlet-class>com.sxt.EamilServlet</servlet-class>
                   <!--这里的数字1是代表这个servlet是第几个运行,启动的顺序-->
                       <load-on-satrtup>1</load-on-satrtup>
             </servlet>

ServletConfig对象
           (1) 该对象主要用于读取servlet配置信息
                    
            案例:
              <servlet>
                        <servlet-name>MyServlet3</servlet-name>
                        <servlet-class>servlet1.MyServlet3</servlet-class>
                        <!-- 这里可以给servlet配置信息,这里配置的信息只能被该servlet读取 -->
                        <init-param>
                             <param-name>encoding</param-name>
                             <param-value>utf-8</param-value>
                        </init-param>
                </servlet>
                         <!-- 如果这里配置的参数,可被所有的servlet读取 -->
                         <context-param>
                               <param-name>encoding</param-name>
                               <param-value>utf-8</param-value>
                          </context-param>

               如何使用:
 public void doGet(HttpServletRequest request, HttpServletResponse response) throws                                                  ServletException, IOException {
          response.setContentType("text/html");
          String encoding = this.getServletConfig().getInitParameter("encoding");
          response.setCharacterEncoding(encoding);
          PrintWriter out = response.getWriter();
          out.print("编码是"+encoding);

                如果要把所有的参数都读取的话
                    比如
                    
                        <init-param>
                             <param-name>encoding</param-name>
                             <param-value>utf-8</param-value>
                        </init-param>
                        
                         <init-param>
                             <param-name>gbk</param-name>
                             <param-value>1.0</param-value>
                        </init-param>
                        
                         <init-param>
                             <param-name>http</param-name>
                             <param-value>ddddd</param-value>
                        </init-param>
              使用枚举进行遍历
                     //枚举,取出在web.xml当中所有配置的encoding
                  Enumeration<String> names =this.getServletConfig().getInitParameterNames();
                  while (names.hasMoreElements()) {//使用while循环进行遍历
                           String name = names.nextElement();
                           System.out.println(name);
                           System.out.println(this.getServletConfig().getInitParameter(name));
              
                    servletConfig对象:
                                1.获得字符集编码
                                2.获得数据库连接信息
                                3.获得配置文件,查看Struts案例的web.xml文件
0 0