深入了解servlet技术

实现第一个Servlet程序(一)

(一)Servlet工作原理示意图

(二)在Eclipse中创建Servlet应用程序的结构

(三)在src目录下创建com.haha包,并在包下创建Demo类

(四)使用xml文件配置Demo类

(五)Servlet的多重映射 
Servlet的多重映射指同一个Servlet可以被映射成多个虚拟路径,因此客户端可以通过多个路径对同一个Servlet进行访问。

(六)运行结果


HttpServletRequest 详解

getRequestURL()    返回客户端发出请求时的完整URL。
getRequestURI()    返回请求行中的参数部分。
getQueryString ()    方法返回请求行中的参数部分(参数名+值)
getRemoteHost()    返回发出请求的客户机的完整主机名。
getRemoteAddr()    返回发出请求的客户机的IP地址。
getPathInfo()    返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以"/"开头。
getRemotePort()    返回客户机所使用的网络端口号。
getLocalAddr()    返回WEB服务器的IP地址。
getLocalName()    返回WEB服务器的主机名。
 

验证码的实现


<%@ WebHandler Language = "C#"  Class="WaterMark" %>
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Windows;
//需要添加的引用
using System.Drawing;
using System.Drawing.Drawing2D;//二维的图形或图像
using System.Web.SessionState;
 
namespace NewSystem.handler
{
    /// <summary>
    /// WaterMark 的摘要说明
    /// </summary>
    public class WaterMark : IHttpHandler, IRequiresSessionState
    //要使用session必须实现该接口
    {
 
        public void ProcessRequest(HttpContext context)
        {
            //产生5位随机字符
            string checkCode = GenCode(5);
            //将字符串保存到session中,以便需要时进行验证
            context.Session["Code"] = checkCode;
            //产生宽70,高22的位图
            System.Drawing.Bitmap image = new System.Drawing.Bitmap(70, 22);
            //从指定的image(容器,用户装载图画)中创建新的Graphics
            //(工具,用于操作图画)
            Graphics g = Graphics.FromImage(image);
 
            try
            {
                //生成随机生成器
                Random random = new Random();
 
                //清空图片背景色
                g.Clear(Color.White);
 
                //画图片的背景噪音线
                int i;
                for (i = 0; i < 25; i++)
                {
                    int x1 = random.Next(image.Width);
                    int x2 = random.Next(image.Width);
                    int y1 = random.Next(image.Width);
                    int y2 = random.Next(image.Width);
 
                    g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
 
                }
 
                //设置字体样式
                Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold));
                System.Drawing.Drawing2D.LinearGradientBrush
                brush = new System.Drawing.Drawing2D.LinearGradientBrush(
               new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed,
               1.2F, true);
 
                //文本字符串格式,字体样式,文本样式,文本起始左上角x,y
 
                g.DrawString(checkCode, font, brush, 2, 2);
 
                g.DrawString(checkCode, font, brush, 2, 2);//文本字符串格式,字体样式,文本样式,文本起始左上角x,y
 
                //画图片的前景噪音点
                g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
                System.IO.MemoryStream ms = new System.IO.MemoryStream();//声明一个类对象,读写内存不是磁盘,
                image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);//指定的文件,指定的格式,图像格式
                context.Response.ClearContent();//清楚缓冲区流的所有内容输出
                context.Response.ContentType = "image/Gif";
                context.Response.BinaryWrite(ms.ToArray());//将一个二进制字符串写入HTTP流中(将流内容写入字符数组)
            }
            finally
            {
                g.Dispose();//释放资源
                image.Dispose();//释放image占用的资源
            }
        }
 
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
 
        /// <summary>
        /// 产生随机字符串
        /// </summary>
        /// <param name="num">随机出几个字符</param>
        /// <returns>随机出的字符串</returns>
        private string GenCode(int num)
        {
            string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";            
            char[] chastr = str.ToCharArray();
            string code = "";
            Random rd = new Random();
            int i;
            for (i = 0; i < num; i++)
            {
                //产生随机截取位置
                code += str.Substring(rd.Next(0, str.Length), 1);
 
            }
 
            return code;
        }
    }
 
Servlet的生命周期

服务器启动时(web.xml中配置load-on-startup=1,默认为0)或者第一次请求该servlet时,就会初始化一个Servlet对象,也就是会执行初始化方法init(ServletConfig conf),该servlet对象去处理所有客户端请求,service(ServletRequest req,ServletResponse res)方法中执行,最后服务器关闭时,才会销毁这个servlet对象,执行destroy()方法。其中加载阶段无法观察,但是初始化、服务、销毁阶段是可以观察到的。

什么是ServletContext

WEB容器在启动时,它会为每个Web应用程序都创建一个对应的ServletContext,它代表当前Web应用。并且它被所有客户端共享。

ServletContext对象可以通过ServletConfig.getServletContext()方法获得对ServletContext对象的引用,也可以通过this.getServletContext()方法获得其对象的引用。

由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。公共聊天室就会用到它。

当web应用关闭、Tomcat关闭或者Web应用reload的时候,ServletContext对象会被销毁

1.首先在xml文件中配置初始化参数


    <context-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
    </context-param>

2.在类中通过ServletContext的getInitParameter(“url”)方法获取初始化参数

       ServletContext context = this.getServletContext();
        String url = context.getInitParameter("url");
        resp.getWriter().print(url);

3.在xml中注册当前类

    <servlet>
        <servlet-name>GetP</servlet-name>
        <servlet-class>com.***.******</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>GetP</servlet-name>
        <url-pattern>/getp</url-pattern>
    </servlet-mapping>
实现网页自动刷新

使用

 
  1. <script language="javascript">

  2. setTimeout("self.location.reload();",1000);

  3. <script>


实现本页面自动刷新,每秒一次

若是要跳转到其他页面,则可以使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值