一,简答题
1、Servlet的体系结构
1)Servlet接口,规定了必须由Servlet类实现并且由Servlet引擎识别和管理的方法集
2)GenericServlet抽象类,提供了除service()方法之外其他有关Servlet生命周期的方法
3)ServletConfig接口,获取Servlet初始化参数和ServletContext对象
4)HttpServlet抽象类,在原有Servlet接口上添加了对HTTP协议的处理,比Servlet功能更强大
5)HttpServletRequest接口,用于封装HTTP请求信息
6)HttpServletResponse接口,用于封装HTTP响应消息
02、Servlet的生命周期
1)实例化
如果Servlet配置了load-on-startup,则服务器在启动时自动实例化该Servlet,
如果没有配置,则在服务器启动后,客户首次向Servlet发出请求时,实例化该Servlet。
2)初始化
Servlet实例化后,Servlet容器将调用Servlet的init方法来对Servlet实例进行初始化,
如果初始化成功,Servlet在Web容器中会处于服务可用状态;
如果初始化失败,Servlet容器会销毁该实例;
当Servlet运行出现异常时,Servlet容器会使该实例变为服务不可用状态。
3)请求处理
服务器接收到客户端请求,会为该请求创建“请求”对象和“响应”对象,
并调用service()方法,service()方法再调用其他方法来处理请求。
在Servlet生命周期中,service()方法可能被多次调用。
当多个客户端同时访问某个Servlet的service()方法时,服务器会为每个请求创建一个线程,
这样可以并行处理多个请求,减少请求处理的等待时间,提高服务器的响应速度。
4)服务终止
当Servlet容器需要终止Servlet,它会先调用Servlet的destroy()方法使其释放正在使用的资源。
在调用destroy()方法之前,必须让当前正在执行service()方法的任何线程完成执行。
在destroy()方法完成后,Servlet容器必须释放Servlet实例以便被垃圾回收。
03、转发与重定向的区别
重定向和请求转发都可以让浏览器获得另外一个URL所指向的资源,但两者的内部运行机制有很大的区别:
1)请求转发只能将请求转发给同一个Web应用中的组件;而重定向不仅可以重定向到当前应用程序中的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,或者重定向到其他站点的资源;
2)请求转发过程结束后,浏览器地址栏保持初始的URL地址不变;重定向结束后,浏览器地址栏的URL会发生改变,由初始的URL地址变成重定向的目标URL;
3)请求转发调用者与被调用者共享相同的request、response对象,它们属于同一个访问的请求和响应过程;重定向调用者与被调用者使用各自的request对象和response对象,它们属于两个独立访问的请求和响应过程
04、include指令与include动作的区别
1)共同点:include指令元素和include动作元素的作用都是实现包含文件代码的复用。
2)不同点1:include指令元素是在翻译阶段就引入所包含的文件,被处理的文件在逻辑和语法上依赖于当前JSP页面,优点是页面的执行速度快。
3)不同点2:include动作元素是在JSP页面运行时才引入包含文件所产生的应答文本,被包含的文件在逻辑和语法上独立于当前JSP页面,优点是可以使用param子元素更加灵活地处理所需要的文件,缺点是执行速度要慢一些。
05、JSP的脚本元素的组成及功能
1)脚本元素允许用户将小段的代码添加到JSP页面中,包括脚本、表达式、声明和注释
2)脚本,<% %>,是指JSP中的代码部分,在这个部分中可以使用几乎任何Java的语法
3)表达式,<%= %>,是做一种简化的输出形式
4)声明,<%! %>,定义一个或多个变量和方法
5)注释,<%-- --%>,编译时忽略其内容,在客户端看不到
06、JSP的指令元素的组成及功能
1)指令用来向容器提供编译信息,并不向客户端产生任何输出,只在当前页面中有效。
2)page指令一般位于JSP页面的开头部分,用来描述和页面相关的信息
3)include指令在页面翻译期间引入另一个文件
4)include指令包含文件时,必须保证新合并生成的文件符合JSP语法规则
5)taglib指令用于指定JSP页面所使用的标签库,通过该指令可以在JSP页面中使用标签库中的标签
07、JSP的动作元素的组成及功能
1)<jsp:include>动作用于在页面被请求时引入一个文件
2)<jsp:forward>动作用于把请求转发到另一个页面
3)<jsp:useBean>动作用于查找或实例化一个JavaBean
4)<jsp:setProperty>动作用于设置JavaBean的属性
5)<jsp:getProperty>动作用于输出某个JavaBean的属性
08、JavaBean的规范
1)JavaBean是一个公开的(public)类,以便被外部程序访问;
2)具有一个无参的构造方法,以便被外部程序实例化时调用;
3)提供setXxx()方法和getXxx()方法,以便让外部程序设置和获取其属性。
09、JSP的page指令中的import、contentType、pageEncoding、errorPage、buffer属性的功能
1)import:指定导入的Java软件包或类名列表,若有多个类,中间用逗号隔开
2)contentType:指定MIME类型和JSP页面响应时的编码方式,默认为“text/html;charset=ISO8859-1”
3)pageEncoding:指定JSP文件本身的编码方式,例如pageEncoding="UTF-8"
4)errorPage:设定JSP页面发生异常时重新指向的页面URL,指向的页面文件要把isErrorPage设成true
5)buffer:指定输出流是否需要缓冲,如果设成true则当输出缓冲区满的时候
10、@WebServlet注解常用的属性
1)name Servlet的名字,一般与Servlet的类名相同
2)urlPatterns 指定URL匹配模式,可以是地址映射(/servlet1)、目录映射(/servlet/*)、扩展名映射(*.action)
3)value 等价于urlPatterns,两个属性不能同时使用
4)loadOnStartup 指定Servlet的加载顺序 未指定或<0,表示该Servlet第一次被请求时才加载 >=0,表示应用启动时加载该Servlet,值越小,越先加载,原则上不同Servlet值不同
5)initParams 一组Servlet初始化参数
11、JSP的9大内置对象
1)request:请求对象,提供客户端HTTP请求数据的访问
2)response:响应对象,用来向客户端输出响应
3)out:输出对象,提供对输出流的访问
4)session:会话对象,用来保存服务器与每个客户端会话过程中的信息
5)application:应用程序对象,用来保存整个应用环境的信息
6)pageContext:页面上下文对象,用于存储当前JSP页面的相关信息
7)config:页面配置对象,JSP页面的配置信息对象
8)page:当前JSP页面对象,即this
9)exception:异常对象,用于处理JSP页面中的错误
12、JSP的四种作用域及其生命周期
1)页面域(page scope),存储在页面域的对象只对于它所在页面是可访问的。
2)请求域(request scope),请求域的生命周期是指一次请求过程,包括请求被转发(forward)或者被包含(include)的情况。存储在请求域中的对象只有在此次请求过程中才可以被访问。
3)会话域(session scope),会话域的生命周期是指某个客户端与服务器所连接的时间,存储在会话域中的对象在整个会话期间(可能包含多次请求)都可以被访问。
4)应用域(application scope),应用域的生命周期是指从服务器开始执行服务到服务器关闭为止,存储在应用域中的对象在整个应用程序运行期间可以被所有JSP和Servlet共享访问。
13、JSP执行过程
1)客户向服务器发送JSP页面请求(request);
2)容器接收到请求后检索对应的JSP页面,如果该JSP页面(或被修改后的JSP页面)是第一次被请求,则容器将此页面中的静态数据(HTML文本)和动态数据(Java脚本)全部转化成Java代码,使JSP文件翻译成一个Java文件,即Servlet;
3)容器将翻译后的Servlet源代码编译形成字节码文件(.class),对于Tomcat服务器而言,生成的字节码文件默认存放在“<Tomcat安装目录>\work目录下”;
4)编译后的字节码文件被加载到容器内存中执行,并根据用户的请求生成HTML格式的响应内容;
5)容器将响应内容即响应(response)发送回客户端。
14、Session对象的创建与销毁(即何时创建Session对象,何时销毁)
创建:
1)对Servlet而言,第一次执行request.getSession()时,创建Session
2)对JSP而言,默认情况下,客户端第一次访问该JSP时,创建Session
销毁:
3)显示调用HttpSession.invalidate()方法
4)Session超时
5)服务器关闭或服务停止
15、EL的隐含对象
pageContext:对应于JSP页面中的pageContext对象
pageScope:代表page域中用于保存属性的Map对象
requestScope:代表request域中用于保存属性的Map对象
sessionScope:代表session域中用于保存属性的Map对象
param:表示一个保存了所有请求参数的Map对象
paramValues:表示一个保存了所有请求参数的Map对象,返回的是一个string[]
header:表示一个保存了所有http请求头字段的Map对象
headerValues:表示一个保存了所有http请求头字段的Map对象,返回string[]数组
cookie:表示一个保存了所有cookie的Map对象
initParam:表示一个保存了所有web应用初始化参数的map对象
16、jstl核心标签库中常见的标签
通用标签:<c:out>、<c:set>、<c:remove>、<c:catch>
条件标签:<c:if>、<c:choose>、<c:when>、<c:otherwise>
迭代标签:<c:forEach>、<c:forTokens>
URL标签:<c:url> 、<c:redirecrt>
17、过滤器的生命周期
1)加载和实例化
Web容器启动时,会根据@WebFilter属性filterName所定义的类名的大小写拼写顺序,或者web.xml中声明的Filter顺序依次实例化Filter。
2)初始化
Web容器调用init(FilterConfig config)方法来初始化过滤器。容器在调用该方法时,向过滤器传递FilterConfig对象。实例化和初始化的操作只会在容器启动时执行,并且只会执行一次。
3)doFilter()方法的执行
当客户端请求目标资源的时候,容器会筛选出符合过滤器映射条件的Filter,并按照@WebFilter属性filterName所定义的类名的大小写拼写顺序,或者web.xml中声明的filter-mapping的顺序依次调用这些过滤器的doFilter()方法。
4)销毁
Web容器调用destroy()方法指示过滤器的生命周期结束。在这个方法中,可以释放过滤器使用的资源。
18、XMLHttpRequest对象的readyState的五种状态和status的五种状态
readyState的五种状态
0、初始状态,未调用send()方法
1:调用send()方法,开始发送请求
2:send()完毕,客户端数据发送到服务器,服务器响应,客户端接收服务器的响应内容
3:开始解析响应内容
4:解析响应内容完毕,客户端可以查看响应结果
status的五种状态:
1xx:信息提示
2xx:成功,常用200
3xx:重定向
4xx:客户端错误
5xx:服务器错误
19、Cookie的分类
1)cookie在浏览器第一次访问服务器时生成,并通过响应带回到浏览器。如果访问servlet时,即没有new Cookie()并添加到响应对象,也没有显式request.getSession()则不生成cookie
2)根据cookie的setMaxAge(单位为秒,<0、>0、=0)区分为:
临时cookie,setMaxAge的参数<0或者没有执行setMaxAge,cookie存储在浏览器内存中,浏览器关闭即失效
永久cookie,setMaxAge的参数>0,cookie以文件形式存储在操作系统中,超过最大值时失效 setMaxAge的参数=0时,删除该cookie
3)浏览器再次访问服务器的时候,根据cookie的setDomain、setPath、setMaxAge共同确定是否携带该cookie,如果携带该cookie,则取该cookie的name和value,其余的domain、path、maxage都不带(为了减少数据量)
这也解释了服务器取到cookie以后,所有cookie的name、value有值,其余domain、path为空、maxage为-1
4)默认情况下,创建Cookie时没有设置路径,该Cookie只能被当前目录及子目录应用访问。
20、当客户端访问服务器页面(html、jsp)时,是否会创建Session对象,为什么
1)访问html等静态资源,因为不会被编译为Servlet,所以不创建Session对象。
2)第一次访问jsp时,服务器会自动为其创建一个session,并把其id发送给客户端,以后客户端接收到请求本应用中其他资源的时候,会自动在请求头上添加:
Cookie:JSESSIONID=客户端第一次拿到的session ID 这样,服务器在接到请求时候,就会收到session ID,并根据ID在内存中找到之前创建的session对象,提供给请求使用。
二,看编程题
登录页面:
前端:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="login" method="post" >
<input type="text" name="name" value="admin"><br>
<input type="password" name="pwd" value="123"><br>
<input type="submit">
</form>
</body>
</html>
servlet:
package com.qst.abc;
import com.qst.bean.User;
import com.qst.db.DbUtil;
@WebServlet("/login")
public class MyServlet1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
try {
Connection conn = DbUtil.getConn();
String sql = "select * from user where username=? and pwd=?";
PreparedStatement pstm = conn.prepareStatement(sql);
pstm.setObject(1, name);
pstm.setObject(2, pwd);
ResultSet rs = pstm.executeQuery();
User u = null;
while(rs.next()) {
u = new User();
u.setId(rs.getInt("id"));
u.setUserno(rs.getString("userno"));
u.setUsername(rs.getString("username"));
u.setPwd(rs.getString("pwd"));
}
if(u == null) {
response.getWriter().write("info error");
}else {
response.sendRedirect("main.jsp");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally{
DbUtil.close(rs,pstmt,conn);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
user:
public class User {
private int id;
private String userno;
private String username;
private String pwd;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserno() {
return userno;
}
public void setUserno(String userno) {
this.userno = userno;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
注册页面:
前端:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="register" method="post" >
姓名<input type="text" name="name"><br>
密码<input type="password" name="pwd"><br>
<input type="submit">
</form>
</body>
</html>
servlet:
package com.qst.servlet;
@WebServlet("/register")
public class MyReg extends HttpServlet {
private static final long serialVersionUID = 1L;
public MyReg() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
User u = new User();
u.setUsername(name);
u.setPwd(pwd);
UserDao ud = new UserDao();
boolean flag = ud.add(u);
if(flag) {
response.getWriter().write("添加成功");
System.out.println("添加成功");
}else {
response.getWriter().write("添加失败");
System.out.println("添加失败");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
user:
public class User {
private int id;
private String username;
private String pwd;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
userdao:
public class UserDao {
public boolean add(User u) {
Connection conn = null;
PreparedStatement pstm = null;
try {
conn = DBUtil.getConnection();
String sql = " insert into user(username,pwd) values(?,?) ";
pstm = conn.prepareStatement(sql);
pstm.setObject(1, u.getUsername());
pstm.setObject(2, u.getPwd());
return pstm.executeUpdate()>0;
} catch (SQLException e) {
e.printStackTrace();
return false;
}finally {
DBUtil.closeJDBC(null, pstm, conn);
}
}
public User queryByNamePwd(String name, String pwd) {
Connection conn = null;
PreparedStatement pstm = null;
ResultSet rs = null;
try {
conn = DBUtil.getConnection();
String sql = " select * from user where username=? and pwd=? ";
pstm = conn.prepareStatement(sql);
pstm.setObject(1, name);
pstm.setObject(2, pwd);
rs = pstm.executeQuery();
User u = null;
while(rs.next()) {
int id = rs.getInt("id");
String str1 = rs.getString("username");
String str2 = rs.getString("pwd");
u = new User();
u.setId(id);
u.setUsername(str1);
u.setPwd(str2);
}
return u;
} catch (SQLException e) {
e.printStackTrace();
return null;
}finally {
DBUtil.closeJDBC(rs, pstm, conn);
}
}
}
分页查询:
jsp:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ page import="java.util.List" %>
<%@ page import="com.qst.enity.User" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>用户管理界面</h1>
<table border="1px" cellspacing="0" align="center">
<tr><td>id</td><td>name</td><td>pwd</td><td>email</td></tr>
<c:forEach items="${AllUsers.pageData}" var="x">
<tr><td>${x.id }</td><td>${x.name }</td><td>${x.pwd }</td><td>${x.email }</td></tr>
</c:forEach>
</table>
<table align="center">
<tr>
<td>当前${AllUsers.currentPage}/${AllUsers.totalPage}页</td>
<td><a href="UserServlet?currentPage=1">首页</a></td>
<td><a href="UserServlet?currentPage=${AllUsers.currentPage-1}">上一页</a></td>
<td><a href="UserServlet?currentPage=${AllUsers.currentPage+1}">下一页</a></td>
<td><a href="UserServlet?currentPage=${AllUsers.totalPage}">尾页</a></td>
</tr>
</table>
</body>
</html>
---------------------------------------------------------------------------------------------------
pageBean:
public class PageBean<T> {
private List<T> pageData;
private int totalCount = 0 ;
private int pageSize = 5;
private int totalPage = 1;
private int currentPage = 1;
private int startNum = 1;
public List<T> getPageData() {
return pageData;
}
public void setPageData(List<T> pageData) {
this.pageData = pageData;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalPage() {
totalPage = totalCount / pageSize;
if (totalCount == 0 || totalCount%pageSize != 0) totalPage++;
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getStartNum() {
return (this.currentPage-1)*this.pageSize;
}
public void setStartNum(int startNum) {
this.startNum = startNum;
}
}
----------------------------------------------------------------------------------------------------
dao :
public PageBean<User> queryAll2(String currentPage) {
PageBean<User> pageBean = new PageBean<>();
pageBean.setTotalCount(getTotalCount());
int no;
try {
no = Integer.parseInt(currentPage);
if(no<1)
no = 1;
else if(no>pageBean.getTotalPage())
no = pageBean.getTotalPage();
}catch (Exception e) {
no = 1;
}
pageBean.setCurrentPage(no);
List<User> users = new ArrayList<>();
try {
conn = DbUtil.getConn();
String sql = " select * from user limit ?,? ";
pstm = conn.prepareStatement(sql);
pstm.setObject(1, pageBean.getStartNum());
pstm.setObject(2, pageBean.getPageSize());
ResultSet rs = pstm.executeQuery();
while(rs.next()) {
User u = new User();
u.setId(rs.getInt("id"));
u.setName(rs.getString("name"));
u.setPwd(rs.getString("pwd"));
u.setEmail(rs.getString("email"));
u.setRole(rs.getString("role"));
users.add(u);
}
pageBean.setPageData(users);
return pageBean;
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
DbUtil.close(rs,pstm,conn);
}
}
servlet:
@WebServlet("/UserServlet")
public class UserServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public UserServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String pageNoStr = request.getParameter("currentPage");
UserDao us = new UserDao();
PageBean<User> users = us.queryAll2(pageNoStr);
request.setAttribute("AllUsers", users);
request.getRequestDispatcher("userManage.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
文件的上传
前端:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="UploadServlet" enctype="multipart/form-data" method="post" >
<input type="file" name="f1" >
<input type="submit">
</form>
</body>
</html>
servlet:
@WebServlet("/UploadServlet")
@MultipartConfig
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public UploadServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
0、这种写法会把所有上传的文件都存为1.txt,覆盖
Part p = request.getPart("f1");
p.write("c://temp//1.txt");
Part p = request.getPart("f1");
String header = p.getHeader("content-disposition");
String fileName = getFileName(header);
String suffix = fileName.substring(fileName.lastIndexOf("."));
String str = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
fileName = fileName.substring(0,fileName.lastIndexOf("."))+"_"+str+suffix;
p.write("c://temp//"+fileName);
response.getWriter().write("upload ok");
}
private String getFileName(String header)
{
String[] temp1 = header.split(";");
String[] temp2 = temp1[2].split("=");
return temp2[1].substring(temp2[1].lastIndexOf("\\") + 1).replaceAll("\"", "");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
1、生成验证码的Servlet
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
int width = 80;
int height = 30;
BufferedImage image= new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(Color.BLUE);
g.fillRect(0, 0, width, height);
String[] codes = {"0","1","2","3","4","5","6","7","8","9"};
StringBuilder sb = new StringBuilder();
Random r = new Random();
g.setColor(Color.WHITE);
for(int i=0; i<4; i++) {
int n = r.nextInt(10);
String code = codes[n];
g.drawString(code, 20*i, 15);
sb.append(code);
}
request.getSession().setAttribute("checkcode", sb.toString());
response.setContentType("image/jpeg");
response.setDateHeader("expires", 0);
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
ImageIO.write(image, "jpeg", response.getOutputStream());
}
2、登录界面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function reCode()
{
document.getElementById("chkcode").src= "ChkcodeServlet?x="+new Date();
}
</script>
</head>
<body>
<form action="LoginServlet" method="post">
<input type="text" name="user" placeholder="用户名"><br>
<input type="password" name="pwd" placeholder="密码"><br>
<input type="text" name="chkcode" placeholder="验证码">
<img id="chkcode" title="点击刷新" onclick="reCode()" src="ChkcodeServlet" ><br>
<input type="submit">
</form>
</body>
</html>