0


Java web期末

一,简答题

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")publicclassMyServlet1extendsHttpServlet{protectedvoiddoGet(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 =newUser();
                        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);}}protectedvoiddoPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}
    user:
        publicclassUser{private int id;private String userno;private String username;private String pwd;public int getId(){return id;}publicvoidsetId(int id){this.id = id;}public String getUserno(){return userno;}publicvoidsetUserno(String userno){this.userno = userno;}public String getUsername(){return username;}publicvoidsetUsername(String username){this.username = username;}public String getPwd(){return pwd;}publicvoidsetPwd(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")publicclassMyRegextendsHttpServlet{privatestatic final long serialVersionUID = 1L;publicMyReg(){super();}protectedvoiddoGet(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 =newUser();
                u.setUsername(name);
                u.setPwd(pwd);
                UserDao ud =newUserDao();
                boolean flag = ud.add(u);if(flag){
                    response.getWriter().write("添加成功");
                    System.out.println("添加成功");}else{
                    response.getWriter().write("添加失败");
                    System.out.println("添加失败");}}protectedvoiddoPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}
    user:
        publicclassUser{private int id;private String username;private String pwd;public int getId(){return id;}publicvoidsetId(int id){this.id = id;}public String getUsername(){return username;}publicvoidsetUsername(String username){this.username = username;}public String getPwd(){return pwd;}publicvoidsetPwd(String pwd){this.pwd = pwd;}}
    userdao:
        publicclassUserDao{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();returnfalse;}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 =newUser();
                        u.setId(id);
                        u.setUsername(str1);
                        u.setPwd(str2);}return u;}catch(SQLException e){
                    e.printStackTrace();returnnull;}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:publicclassPageBean<T>{private List<T> pageData;//0、查询到的分页结果集private int totalCount =0;//1、总记录数private int pageSize =5;//2、每页记录数        private int totalPage =1;//3、总页数private int currentPage =1;//4、当前页private int startNum =1;//5、开始行号:(当前页-1)*每页记录数public List<T>getPageData(){return pageData;}publicvoidsetPageData(List<T> pageData){this.pageData = pageData;}public int getTotalCount(){return totalCount;}publicvoidsetTotalCount(int totalCount){this.totalCount = totalCount;}public int getCurrentPage(){return currentPage;}publicvoidsetCurrentPage(int currentPage){this.currentPage = currentPage;}public int getPageSize(){return pageSize;}publicvoidsetPageSize(int pageSize){this.pageSize = pageSize;}public int getTotalPage(){
        totalPage = totalCount / pageSize;if(totalCount ==0|| totalCount%pageSize !=0)  totalPage++;return totalPage;}publicvoidsetTotalPage(int totalPage){this.totalPage = totalPage;}public int getStartNum(){return(this.currentPage-1)*this.pageSize;}publicvoidsetStartNum(int startNum){this.startNum = startNum;}}----------------------------------------------------------------------------------------------------dao:public PageBean<User>queryAll2(String currentPage){
        PageBean<User> pageBean =newPageBean<>();
        pageBean.setTotalCount(getTotalCount());
        int no;try{
            no = Integer.parseInt(currentPage);if(no<1)
                no =1;elseif(no>pageBean.getTotalPage())
                no = pageBean.getTotalPage();}catch(Exception e){
            no =1;}        
        pageBean.setCurrentPage(no);
        List<User> users =newArrayList<>();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 =newUser();
                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();returnnull;}finally{
            DbUtil.close(rs,pstm,conn);}}servlet:

@WebServlet("/UserServlet")publicclassUserServletextendsHttpServlet{privatestatic final long serialVersionUID = 1L;publicUserServlet(){super();}protectedvoiddoGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String pageNoStr = request.getParameter("currentPage");
        UserDao us =newUserDao();
        PageBean<User> users = us.queryAll2(pageNoStr);
        request.setAttribute("AllUsers", users);
        request.getRequestDispatcher("userManage.jsp").forward(request, response);}protectedvoiddoPost(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
            publicclassUploadServletextendsHttpServlet{privatestatic final long serialVersionUID = 1L;publicUploadServlet(){super();}protectedvoiddoGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {0、这种写法会把所有上传的文件都存为1.txt,覆盖
                    Part p = request.getPart("f1");    
                    p.write("c://temp//1.txt");//                    1、request取上传文件信息
                    Part p = request.getPart("f1");//                    2、从part中取文件名
                    String header =  p.getHeader("content-disposition");//                    3、不同浏览器的p.getHeader返回格式不同,需重新提取文件名
                    String fileName =getFileName(header);//                    4、取文件的扩展名
                    String suffix = fileName.substring(fileName.lastIndexOf("."));//                    5、为防止文件重名导致覆盖,使用时间字符串重新拼接文件名
                    String str =newSimpleDateFormat("yyyyMMddHHmmssSSS").format(newDate());        
                    fileName = fileName.substring(0,fileName.lastIndexOf("."))+"_"+str+suffix;//                    6、把上传文件的内容写入服务器
                    p.write("c://temp//"+fileName);        
                    response.getWriter().write("upload ok");}private String getFileName(String header){// 把form-data; name="myfile"; filename="abc.doc"切成3份
                String[] temp1 = header.split(";");// 把filename="abc.doc"切成2份    
                String[] temp2 = temp1[2].split("=");// 从abc.doc或者E:\abc.doc中提取文件名    return temp2[1].substring(temp2[1].lastIndexOf("\\")+1).replaceAll("\"","");}protectedvoiddoPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}-------------------------------------------------------------------------------------------------------------------------------------------------------------------1、生成验证码的Servlet
protectedvoiddoGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{//        1、定义验证码底图宽高
        int width =80;
        int height =30;//        2、创建验证码底图
        BufferedImage image=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);//        3、取验证码底图的画笔,用来画底图、写验证码
        Graphics g = image.getGraphics();//        4、设置画笔颜色
        g.setColor(Color.BLUE);//        5、画黑色的验证码底图
        g.fillRect(0,0, width, height);//        7、定义验证码集合
        String[] codes ={"0","1","2","3","4","5","6","7","8","9"};
        StringBuilder sb =newStringBuilder();
        Random r =newRandom();//        8、修改画笔颜色,准备往底图上写验证码
        g.setColor(Color.WHITE);//        9、随机生成4位验证码,写入底图并存入字符串for(int i=0; i<4; i++){
            int n = r.nextInt(10);
            String code = codes[n];//            10、验证码写入底图
            g.drawString(code,20*i,15);//            11、验证码存入字符串
            sb.append(code);}//        12、验证码字符串写入session,即存到服务器端,备验证使用
        request.getSession().setAttribute("checkcode", sb.toString());//        13、设置响应内容为图片
        response.setContentType("image/jpeg");//        14、设置http报头,不允许缓存
        response.setDateHeader("expires",0);
        response.setHeader("Pragma","no-cache");
        response.setHeader("Cache-Control","no-cache");//        15、验证码写入客户端
        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">functionreCode(){
      document.getElementById("chkcode").src="ChkcodeServlet?x="+newDate();}</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>
标签: java

本文转载自: https://blog.csdn.net/ordinary_pq/article/details/124300904
版权归原作者 ordinary_pq 所有, 如有侵权,请联系我们删除。

“Java web期末”的评论:

还没有评论