实现第一个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>
实现网页自动刷新
使用
-
<script language="javascript">
-
setTimeout("self.location.reload();",1000);
-
<script>
实现本页面自动刷新,每秒一次
若是要跳转到其他页面,则可以使用