一、servrlet的生命周期:
1.装载Servlet。这项操作一般是动态执行的。然而,Server通常会提供一个管理的选项,用于在Server启动时强制装载和初始化特定的Servlet。
2.Server创建一个Servlet的实例
3.Server调用Servlet的init()方法
4.一个客户端的请求到达Server
5.Server创建一个请求对象
6.Server创建一个响应对象
7.Server激活Servlet的service()方法,传递请求和响应对象作为参数
8.service()方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息
9.service()方法使用响应对象的方法,将响应传回Server,最终到达客户端。service()方法可能激活其它方法以处理请求,如doGet()或doPost()或程序员自己开发的新的方法。
10.对于更多的客户端请求,Server创建新的请求和响应对象,仍然激活此Servlet的service()方法,将这两个对象作为参数传递给它。如此重复以上的循环,但无需再次调用init()方法。一般Servlet只初始化一次(只有一个对象),当Server不再需要Servlet时(一般当Server关闭时),Server调用Servlet的Destroy()方法。
二:servlet请求和属性
在使用超链接的请求servlet时,如果重写了service方法,会直接调用servlet方法,如果想调用doGet或doPost方法,则不需重写service方法,也可以通过form表单去请求。
在service方法中可以获得相关属性:详见API。
三:servlet配置
主要是web.xml里面配置
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.servlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<!--
<url-pattern>/servlet/TestServlet</url-pattern>
-->
<url-pattern>*.do</url-pattern>
<!--
<url-pattern>/servlet/*</url-pattern>
-->
</servlet-mapping>
配置的格式都是请求到配置的servlet。
利用servlet输出登陆的验证码操作:
1、servlet类 doGet方法:
RandomGraphics g = new RandomGraphics();
g.setCharLength(6);
ServletOutputStream sos = resp.getOutputStream();
g.buildImage(sos);
req.getSession().setAttribute("code", g.getCheckCode());
sos.flush();
2、RandomGraphics类:
public String buildImage(OutputStream out) {
BufferedImage image = new BufferedImage(this.width, this.height, this.imageType);
Graphics g = image.getGraphics();
Graphics2D g2d = (Graphics2D) g;
g.setColor(this.getColor(200, 250));
g.fillRect(0, 0, this.width, this.height);
g.setFont(new Font("Times New Roman", Font.BOLD, 17));
//g.setColor(this.getColor(180, 200));
g.setColor(new Color(0,0,0));
/*
*绘制100条干扰线
*/
for (int i = 0; i < 100; i++ ) {
int x1 = random.nextInt(this.width);
int y1 = random.nextInt(this.height);
int x2 = random.nextInt(this.width - 3);
int y2 = random.nextInt(this.height - 3);
BasicStroke bs = new BasicStroke(2f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL);
Line2D line = new Line2D.Double(x1, y1, x2, y2);
g2d.setStroke(bs);
g2d.draw(line);
g.setColor(getColor(180, 222));
}
StringBuffer codeStr = new StringBuffer();
for (int i = 0; i < this.charLength; i++) {
String c = String.valueOf(random.nextInt(10));
codeStr.append(c);
Color color = new Color(20+random.nextInt(110),
20+random.nextInt(110), 20+random.nextInt(110));
g.setColor(color); /*随机文字,旋转文字到指定角度*/
g.drawString(String.valueOf(c), 15 * i+2, 20);
}
this.checkCode = codeStr.toString();
g.dispose();
//ByteArrayInputStream inputStream = null;
//ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
//ImageOutputStream imgOutput = ImageIO.createImageOutputStream(outputStream);
//ImageIO.write(image, "JPEG", imgOutput);
ImageIO.write(image, "JPEG", out);
//imgOutput.close();
//inputStream = new ByteArrayInputStream(outputStream.toByteArray());
//outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
//return inputStream;
return this.checkCode;
}
/**
* 利用随机数,随机生成一个Color颜色的对象
* @param fc
* @param bc
* @return颜色对象
*/
private Color getColor(int fc, int bc) {
if (fc > 255) {
fc = 255;
}
if (bc > 255) {
bc = 255;
}
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
return new Color(r, g, b);
}
3、配置servlet
<servlet>
<servlet-name>CheckCodeServlet</servlet-name>
<servlet-class>com.hw.Graphics.CheckCodeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CheckCodeServlet</servlet-name>
<url-pattern>/checkcode</url-pattern>
</servlet-mapping>
4、在JSP页面上面直接请求就可以了:
验证码:<input type="text" name="code" /> <img alt="验证码" src="checkcode"><br>
这样的web.xml加载的打开页面就会去请求servlet得到图片