zoukankan      html  css  js  c++  java
  • web开发技术中Servlet技术的概述

    1.servlet是什么:
    servlet是一个位于服务器端的java应用程序
    它可以像jsp一样,直接输出信息

    servlet类必须继承HttpServlet类,否则,不能称为serlvet

    servlet类是一个java类,但是有自己的规则
    servlet必须在web.xml文件中注册
    服务器在启动的时候,可以根据这些配置来加载servlet类.......


    2.servlet作用:
    C:控制层
    serlvet主要用来做控制转发,需要结合到MVC模式(套路)


    3.servlet生命周期:
    init
    service
    destroy

    /**
    * Initialization of the servlet. <br>
    *
    * @throws ServletException if an error occure
    * 在servlet被第一次访问时,本方法将会被自动调用
    * 本方法被称为初始化方法
    * 只会被调用一次
    */
    public void init() throws ServletException {
    // Put your code here
    System.out.println("我是init方法");
    }

    /**
    * 具体的业务方法
    * 该方法将会被调用多次
    * 每次访问servlet时,该方法都会被调用
    * service根据request.getMethod得到你的提交方式,然后由它来决定对doGet.doPost的调用
    */
    public void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException{
    super.service(request, response);
    System.out.println("我是service.....................................");
    }

    /**
    * Destruction of the servlet. <br>
    * servlet被注销的时候
    * 本方法为销毁方法
    * 也只是被服务器自动调用一次

    */
    public void destroy() {
    super.destroy(); // Just puts "destroy" string in log
    // Put your code here
    System.out.println("destroy方法被调用..............");
    }

     

    4.定义servlet的必需的步骤
    A.定义一个类,继承HttpServlet
    B.重写doGet和doPost方法
    C.实现doGet和doPost的逻辑
    D.在web.xml部署描述文件中定义servlet的映射方式


    5.为web应用设置一个欢迎页面

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

    如果第一个页面找不到,会依次向下找

    6.request和其他类的关系

    HttpSession session = request.getSession();
    session.setAttribute("username", "scott");
    
    ServletContext application = this.getServletContext();
    application.setAttribute("userlist", null);
    
    RequestDispatcher rd = request.getRequestDispatcher("C.jsp");
    rd.forward(request, response);

    7,在servlet中使用session

    HttpSession ss = request.getSession();
    List list=new ArrayList();
    list.add("SMITH");
    list.add("ALLEN");
    ss.setAttribute("userlist", list);

    8.关于servlet的使用方式

    servlet可以像jsp一样被访问
    A.在地址栏内可以直接输入地址来访问
    http://localhost:8088/myproject15/servlet/CServlet


    B.超链接方式
    <a href="servlet/CServlet?username=zhangshan&pwd=123456789">链接</a>

    C.include或者forward标签
    <jsp:forward page="servlet/CServlet?username=wangwu&pwd=123456"></jsp:forward>


    D.javascript转向
    <input type="button" value="点击"
    onclick="location.replace('servlet/CServlet?username=abcd&pwd=123');">

    E.response转向


    9,在web服务器中配置errorpage

    <error-page>
    <error-code>500</error-code>
    <location>/index.html</location>
    </error-page>
    
    <error-page>
    <exception-type>java.lang.NullPointerException</exception-type>
    <location>/index.html</location>
    </error-page>


    10.关于session-config的配置

    <session-config>
    <session-timeout>1</session-timeout>
    </session-config>

    超时时间单位为分钟


    11.为servlet定义初始化参数
    使用getInitParameter()方法来提取servlet的初始化参数

    定义:

    <servlet>
    <servlet-name>a</servlet-name>
    <servlet-class>com.sun.demo.MyServlet</servlet-class>
    <init-param>
    <param-name>type</param-name>
    <param-value>text/html;charset=GBK</param-value>
    </init-param>
    </servlet>


    提取方式:
    String str = this.getInitParameter("type");

     

    12.过滤器:
    在到达目标页面之前,所处理的动作
    作用:
    权限的校验
    日志记录
    图片的转换
    数据的加密
    等等.

     

    实现步骤:
    1).实现Filter接口
    2).实现doFilter方法
    3).传递过滤链,放请求过去
    4).在web.xml文件中注册过滤器


    13.监听器
    靠事件来触发的,比如application执行了setAttribute();


    步骤
    两步:
    A.实现listener接口,说出你想要做什么
    B.在web.xml文件中注册这个监听器

    14.字符集转换的问题

    分几类情况
    A.如果页面中使用jsp:include或jsp:forward关系,中文字符集转换:
    request.setCharacterEncoding("GBK");

    B.在servlet中显示中文:
    由于无法使用jsp页面中的编码指令
    <%@ page language="java" import="java.util.*" contentType="text/html;charset=GBK"%>

    那么在servlet中设置输出编码就应该通过:
    response.setContentType("text/html;charset=GBK");


    C.普通的参数传递
    普通的参数也需要考虑到中文的问题
    除了页面显示设置 contentType="text/html;charset=GBK"之外,我们还需要对中文字符进行字符转换硬编码

    超链接:
    String str = request.getParameter("username");
    str = new String(str.getBytes("iso8859-1"),"GBK");


    form表单:
    String str= request.getParameter("username");
    str = new String(str.getBytes("iso8859-1"),"GBK");

    javascript转向:
    String str = request.getParameter("username");
    str = new String(str.getBytes("ISO8859-1"),"gbk");


    response方式转向:
    String message = "我的中文测试";
    response.sendRedirect("L.jsp?message="+URLEncoder.encode(message));

    接收页面:
    String message = request.getParameter("message");
    message = new String(message.getBytes("ISO8859-1"),"GBK");


    request等作用域
    request.setAttribute("username","我的测试名称");
    session.setAttribute("passwd","我的密码");
    不需要进行转换

     


    15.编写线程安全的servlet

    java线程共享数据的概念
    多线程使用的数据是共享的

    boolean shutdown = true;
    
    /**
    * 线程体
    */
    public void run() {
    // TODO Auto-generated method stub
    int i = 0;
    while (1 == 1) {
    i++;
    System.out.println(Thread.currentThread().getName()+"="+i);
    if (shutdown == false) {
    break;
    }
    }
    System.out.println("本线程结束!");
    }


    servlet本身建立在多线程的基础上,所以对于全局变量也存在"共享数据"的问题.

    在servlet中定义一个全局变量,该数据将会被多个线程"共享",

    String username;
    
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    username = request.getParameter("username");//张三
    
    try {
    Thread.sleep(1000*6);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    out.println(username);
    out.close();
    }


    如果同时提交两个请求:
    http://localhost:8088/myproject19/servlet/AServlet?username=zhangshan
    http://localhost:8088/myproject19/servlet/AServlet?username=smith
    则:
    两个结果都将显示为smith

    这是因为第一个在访问时,得到了zhangshan的值,后来,username的值被赋为smith
    又因为username是被多个线程所共享的,所以,所有请求里面的username都变成了smith

     

    避免使用全局变量
    方法中的临时变量是在栈上分配空间,而且每个线程都有自己私有的栈空间,所以它们不会影响线程的安全

     

    16.怎么样自动加载servlet
    我们知道,servlet有一个生命周期方法,init,service,destroy,其中init在servlet第一次访问的时候访问,它只能被访问一次.
    如果你需要在服务器启动时,让servlet自动启动,你可以通过load-on-startup来实现,这一点,我们可以通过init方法被调用来观察出来

    load-on-startup是web.xml文件中servlet的配置节点

    描述我们的场景:
    假如你有这样一个需求:
    为提高系统性能,在服务器启动时,从数据库中查询所有的用户名列表,以便在其他页面中可以直接使用,而不需要从数据库再进行查询,如何实现?
    A.ServletContextListener可以在服务器启动时自动执行其方法
    B.可以使用一个servlet,然后定义load-on-startup,让它能够在服务器启动时自动执行其方法

    使用<load-on-startup>1</load-on-startup>可以指定服务器加载顺序


    实例代码:

    /**
    * Initialization of the servlet. <br>
    *
    * @throws ServletException if an error occure
    * 本方法在servlet被加载时访问
    * 这里,我们在服务器启动,自动加载一段数据,起到数据缓存的效果
    */
    public void init() throws ServletException {
    // Put your code here
    List<String> list = new ArrayList<String>();
    list.add("WARD");
    list.add("JONES");
    list.add("JAMES");
    this.getServletContext().setAttribute("datalist",list);
    }

    配置文件设置:

    <servlet>
    <servlet-name>DataCacheServlet</servlet-name>
    <servlet-class>com.sun.demo.DataCacheServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    </servlet>

     

     

     后记:每一天,每一动作,我们所尝试过经历过的,都是辽阔夜空里微微闪烁的星光,即使微茫,

    也有人站在某个角落用闪烁的眸光与你辉映!

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    但是难道我就不能在JBuilder里面看我可爱的中文了吗?[小糊涂的灵感]
    why is j2me midp superior to wap?[小糊涂的灵感]
    NRF51822之GPIOTE介绍
    Unity脚本生命周期
    树状数组学习笔记
    模版—扩展欧几里德
    hdu4339Query
    POJ3273Monthly Expense
    多校第一场
    ZOJJ Watashi's BG3631
  • 原文地址:https://www.cnblogs.com/liu321kai/p/6287835.html
Copyright © 2011-2022 走看看