zoukankan      html  css  js  c++  java
  • Servlet学习总结

    Servlet是sun公司提供的一门用于开发动态web资源的技术,我们也把实现了servlet接口的java程序,称之为Servlet

    1、编写一个Java类,实现servlet接口。

    package Servlet;
    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * 这也是一个页面,一个特殊的页面
     * 完全使用Java编写的页面,甚至可以认为这是一个虚拟页面
     * Request:来自浏览器的请求(输入流)
     * Response:服务器给浏览器的响应(输出流)
     * @author Don
     * @date:日期:2017年4月1日 时间:下午3:30:11*
     * @version 1.0
     */
    public class ServletTest extends HttpServlet {
        /**
         * doGet方式主要来源url的跳转
         */
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            System.out.println("GET通道");
             /**
             * 当多线程并发访问这个方法里面的代码时,会存在线程安全问题吗
             * i变量被多个线程并发访问,但是没有线程安全问题,因为i是doGet方法里面的局部变量,
             * 当有多个线程并发访问doGet方法时,每一个线程里面都有自己的i变量,
             * 各个线程操作的都是自己的i变量,所以不存在线程安全问题
             * 多线程并发访问某一个方法的时候,如果在方法内部定义了一些资源(变量,集合等)
             * 那么每一个线程都有这些东西,所以就不存在线程安全问题了
             */
            int i=1; //若定义为全局变量则线程不安全
            i++;
            
            //若程序所需必须为全局变量的时,定义全局变量后,用如下方式
            synchronized (this) {//在java中,每一个对象都有一把锁,这里的this指的就是Servlet对象
                i++;
                try {
                    Thread.sleep(1000*4);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                resp.getWriter().write(i+"");
            }
            
            //解决get乱码的问题
            String str= req.getParameter("Name");
            byte[] bs = str.getBytes("ISO-8859-1");
            String name = new String(bs, "UTF-8");
        
            
            //告诉浏览器这是个什么响应(解决浏览器展现为练吗)
            resp.setContentType("text/html;charset=UTF-8");
            PrintWriter out = resp.getWriter();
            out.print("<html>");
            out.print("<head>");
            out.print("<title>我的Servlet测试</title>");
            out.print("</head>");
            out.print("<body>这是我得第一个Java Servlet程序...</body>");
            out.print("</html>");
        }
        
        /**
         * doPost方式主要用来提交表单
         */
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            System.out.println("POS通道");
            
            //POST解决乱码
            resp.setCharacterEncoding("UTF-8");
        }
    }

    2、把开发好的Java类通过Web.xml部署到web服务器中。

    在web.xml中配置url访问的Servlet,配置在<web-app></web-app>中

    <servlet>
          <servlet-name>Servelet</servlet-name>
          <servlet-class>Servlet.ServletTest</servlet-class>
      </servlet>
      <!-- 一个Servlet可映射多个URL地址 -->
      <servlet-mapping>
          <servlet-name>Servelet</servlet-name>
          <url-pattern>/hello/good.html</url-pattern>  
      </servlet-mapping>
      <servlet-mapping>
          <servlet-name>Servelet</servlet-name>
          <url-pattern>/hello/good.php</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
          <servlet-name>Servelet</servlet-name>
          <url-pattern>/hello/good.aspx</url-pattern>
      </servlet-mapping>
      
      <!-- 通用匹配符 *和/ /*-->
       <servlet-mapping>
          <servlet-name>Servelet</servlet-name>
          <url-pattern>*.do</url-pattern>
      </servlet-mapping>
       <servlet-mapping>
          <servlet-name>Servelet</servlet-name>
          <url-pattern>/action/*</url-pattern>
      </servlet-mapping>
      
      <!-- 缺省Servlet用于处理所有其他Servlet都不处理的访问请求 -->
       <servlet-mapping>
         <servlet-name>Servelet</servlet-name>
         <url-pattern>/</url-pattern>
       </servlet-mapping>

    Servlet下实现的功能简介

    request    代表浏览器发往Java的请求,包含输入流
    response代表Java发往浏览器的响应,包含输出流
    
    request.getParameter 接一个参数
    request.getParameterValues 接数组
    
    
    GET传汉字容易出现乱码
    POST传汉字只需要设置req.setCharacterEncoding("UTF-8")即可
    
    URL本身有字符集,火狐默认ISO-8859-1
    //火狐GET方式传汉字到Servlet
    String str=req.getParameter("un");
    byte[] bs = str.getBytes("ISO-8859-1");
    String name = new String(bs, "UTF-8");
    System.out.println(name);
    
    重定向:
    //获取上下文路径,也就是所谓的项目根,相当于WebRoot
    String path = request.getContextPath();
    //重定向:给浏览器一个新方向,去吧,重定向之后最好return
    response.sendRedirect(path+"/index.jsp");
    return;
    
    请求转发:
    //请求转发到B,属于服务器内部转发,浏览器是看不到的
    //转发器,路径中的/代表了WebRoot
    RequestDispatcher dis = request.getRequestDispatcher("/servlet/b");
    dis.forward(request, response); //转发
    
    request的生命周期很短,当我们看到页面时它就已经死掉了。
    request.setAttribute(name,object);可以临时存储数据
  • 相关阅读:
    Android自定义控件 -Canvas绘制折线图(实现动态报表效果)
    Android事件分发机制详解(2)----分析ViewGruop的事件分发
    Android事件分发机制详解(1)----探究View的事件分发
    Java单例模式(转载)
    排序算法练习--JAVA(:内部排序:插入、选择、冒泡、快速排序)
    javaIO-学习笔记
    java多线程基础
    java二分查找举例讨论
    tomcat安装部署完整过程
    mariadb安装部署完整过程
  • 原文地址:https://www.cnblogs.com/zxd543/p/6656417.html
Copyright © 2011-2022 走看看