/*生成博客目录的CSS*/ #uprightsideBar{ font-size:12px; font-family:Arial, Helvetica, sans-serif; text-align:left; position:fixed;/*将div的位置固定到距离top:50px,right:0px的位置,这样div就会处在最右边的位置,距离顶部50px*/ top:50px; right:0px; width: auto; height: auto; } #sideBarTab{ /* float:left; */ width:100px; border:1px solid #e5e5e5; border-right:none; text-align:center; background:#ffffff; cursor:pointer; } #sideBarContents{ float:left; overflow:auto; overflow-x:hidden;!important; width:300px; min-height:108px; max-height:460px; border:1px solid #e5e5e5; border-right:none; background:#ffffff; } #sideBarContents dl{ margin:0; padding:0; } #sideBarContents dt{ margin-top:5px; margin-left:5px; } #sideBarContents dd, dt { cursor: pointer; } #sideBarContents dd:hover, dt:hover { color:#A7995A; } #sideBarContents dd{ margin-left:20px; } #sideBarContents dd.indent3{ margin-left:40px; } #sideBarContents dd.indent4{ margin-left:60px; } #sideBarContents dd.indent5{ margin-left:80px; } #sideBarContents dd.indent6{ margin-left:100px; }

Servlet技术

Servlet基础

第1关:实现第一个servlet程序

  • 任务描述
    本关任务:实现第一个Servlet程序。

  • 相关知识
    由于大多数Web应用都是通过HTTP协议和客户端进行交互,且在实际开发servlet中多是编写基于HTTP协议请求的servlet,在Servlet 接口中,专门提供了一个抽象类javax.servlet.http.HttpServlet,它是GenericServlet的子类(GenericServlet是Servlet接口的实现类),专门用于创建应用于HTTP协议的Servlet。为了读者可以更好地了解实际开发中的servle程序实现,本案例将演示如何编写基于HTTP协议请求的servlet。

  • 实现思路

  1. 创建FirstServlet类继承Httpservlet类
  2. 重写开发常用的方法doGet()和doPost()并完成处理操作
  3. 对于该servlet的访问请求在浏览器中显示:第一个servlet程序!
  4. 提交测试
  • 编程要求
    根据提示,在右侧编辑器注明的代码编写区域补充代码,并提交测试。

  • 测试说明
    平台会对你编写的代码进行测试:

  • 测试输入:无

  • 预期输出
    第一个servlet程序!

  • 提示:

  • 输出:

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//代码写在标记区间之内
		/******Begin******/
        	response.setContentType("text/html;charset=utf-8");
		response.getWriter().append("第一个servlet程序!");
		/******End********/
	}

第2关:ServletConfig接口

  • 任务描述
    本关任务:掌握ServletConfig对象的使用

  • 相关知识
    在Servlet运行期间,经常需要一些辅助信息,这些信息可以使用注解@WebServlet或者在web.xml文件中使用一个或多个元素进行配置。当Tomcat初始化一个Servlet时,会将该Servlet的配置信息封装到一个ServletConfig对象中。为了让初学者熟悉ServletConfig对象,本关任务将使用ServletConfig对象读取配置文件中的参数。

  • 设计思路
    1) 在代码编写区间编写代码实现
    2) 在代码区间中,用getInitParameterNames()方法获得所有参数名, 用getInitParameter()方法获取所有参数的值
    3) 将参数的名称key和值value以 key:value 的形式输出

  • 测试说明
    平台会对你编写的代码进行测试:

  • 测试输入:无

  • 预期输出:
    author:xman
    company:GDCVI

  • 提示:

  • 输出:

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	// 代码写在标记区间之内
	/****** Begin ******/
        PrintWriter out = response.getWriter();
        response.setHeader("Content-type","text/html; charset=UTF-8");
        ServletConfig cfg = getServletConfig();

        Enumeration<String> names = cfg.getInitParameterNames();

        while(names.hasMoreElements()){
            String name = names.nextElement();
            String value = cfg.getInitParameter(name);
            out.println(name + ":" + value);
         }
	/****** End ********/
	}

第3关:ServletContext接口

  • 任务描述
    本关任务:掌握用ServletContext对象实现多个Servlet对象数据共享。

  • 相关知识
    由于一个Web应用中的所有Servlet共享同一个ServletContext对象,因此ServletContext对象的域属性可以被该Web应用中的所有Servlet访问。为了让初学者熟悉ServletContext对象,本关将演示用ServletContext对象实现多个Servlet对象的数据共享

  • 设计思路
    统计网站的访问次数:
    1) 本关需要完成两个Servlet代码编写,FirstContext用于存储,SecondContext用于显示,可以通过点击代码区左上角代码文件切换不同的文件进行编辑。
    2) 在类FirstContext中的init()方法中给次数(count)设置一个初始值101,存入到 ServletContext中。
    3) 在类SecondContext中,每次访问doGet()方法就会执行 count + 1,并将count值存入到 ServletContext中。
    4) 在类SecondContext中用getAttribute ("count")方法获取到count值,并按照测试说明要求将结果输出到浏览器。

  • 测试说明
    平台会对你编写的代码进行测试:

  • 测试输入:无

  • 预期输出:
    你是本站第102次访客!

  • 测试输入:

  • 预期输出:

  • 提示:

  • 输出:

FirstContext.java:

	@Override
	public void init(ServletConfig config) throws ServletException {
	// TODO Auto-generated method stub
	super.init(config);
	//代码写在标记区间之内
	/******Begin******/
        int count = 101;
        ServletContext context = this.getServletContext();
        context.setAttribute("count", count);
	/******End********/
	}

SecondContext.java

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	//代码写在标记区间之内
	/******Begin******/
	ServletContext context = this.getServletContext();
        int count = (Integer)context.getAttribute("count");
        count++;
        context.setAttribute("count", count);

        response.setHeader("Content-type","text/html; charset=UTF-8");
        response.getWriter().append("你是本站第" + count + "次访客!");
	/******End********/
	}

请求和响应

第1关:通过 response 对象刷新网页

  • 任务描述
    本关任务:编写一个网页定时刷新并跳转的功能。

  • 相关知识
    为了完成本关任务,你需要掌握 HttpServletResponse 对象的常用方法和应用。

  • 编程要求
    在右侧编辑器 Begin-End 之间补充代码,编写一个模拟用户登录成功2秒后跳转至百度首页的功能,在配置文件中将 Servlet 的访问路径设置为/ServletDemo1。

  • 测试说明
    平台会对你编写的代码进行测试

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /********** Begin **********/
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("用户注册成功,2秒后跳转到百度首页");
        response.setHeader("Refresh", "2;url=http://www.baidu.com");
        /********** End **********/
    }

第2关:通过 request 对象传递数据

  • 任务描述
    本关任务:编写一个通过 HttpRequest 获取,设置和移除对象的程序。

  • 相关知识
    为了完成本关任务,你需要掌握 HttpRequest 对象的作用和常用方法。

  • 编程要求
    在右侧编辑器 Begin-End 之间补充代码,完成使用 HttpRequest 对象传递数据的功能,具体要求如下:

  1. 首先使用 HttpRequest 对象获取属性为username的对象并强转为字符串对象输出;
  2. 使用 HttpRequest 对象设置 username 的属性值为张三并将其输出;
  3. 使用 HttpRequest 移除username属性,再次输出;
  4. 将 Servlet 的访问路径设置为/ServletDemo2,另外特别注意不要删除通过关卡中的 Servlet 配置,否则会通不过关卡,后面关卡也一样,不再做提示。
  • 测试说明
    平台会对你编写的代码进行测试
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /********** Begin **********/
        response.setContentType("text/html;charset=utf-8");

        String username = (String) request.getAttribute("username");
        response.getWriter().write(username);

        request.setAttribute("username", "张三");
        username = (String) request.getAttribute("username");
        response.getWriter().write(username);

        request.removeAttribute("username");
        username = (String) request.getAttribute("username");
        response.getWriter().write(username);
        /********** End **********/
    }

第3关:请求转发

  • 任务描述
    本关任务:编写一个 Servlet 请求之间转发数据的程序。

  • 相关知识
    为了完成本关任务,你需要掌握 HttpServletRequest 请求转发的三种使用方式以及他们的区别。

  • 编程要求
    在右侧编辑器 Begin-End 之间补充代码,完成 ServletDemo3 向 ServletDemo4 转发(forward)数据的程序,具体要求如下:

  1. 将 ServletDemo3 的访问路径设置为/ServletDemo3,并在类中添加userId属性,值为001;
  2. 当访问/ServletDemo3时转发至/ServletDemo4;
  3. 将 ServletDemo4 的访问路径设置为/ServletDemo4,并获取 ServletDemo3 中的userId进行输出;
  4. 在 ServletDemo4 中模拟获取用户userId对应的信息,即用输出语句将信息输出至网页。信息包括用户名张三,用户年龄20;
    具体输出信息格式参考测试说明。
    编写在一个 servlet 查询到用户id,然后请求转发到另外一个 servlet,再通过该用户 id 来获取用户信息进行响应。
  • 测试说明
    平台会对你编写的代码进行测试

web.xml:

  <!-- ********** Begin ********** -->
  <servlet>
    <servlet-name>ServletDemo1</servlet-name>
    <servlet-class>com.educode.servlet.ServletDemo1</servlet-class>
   </servlet>

   <servlet-mapping>
      <servlet-name>ServletDemo3</servlet-name>
      <url-pattern>/ServletDemo3</url-pattern>
   </servlet-mapping>
   
   <servlet-mapping>
      <servlet-name>ServletDemo4</servlet-name>
      <url-pattern>/ServletDemo4</url-pattern>
   </servlet-mapping>
  <!-- ********** End ********** -->

ServletDemo3.java

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /********** Begin **********/
        String userId = "001";
        request.setAttribute("userId",userId);
        // 转发到ServletDemo4
        response.getRequestDispatcher("/ServletDemo4").forward(request, response);
        /********** End **********/
    }

ServletDemo4.java

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /********** Begin **********/
        //设置输出格式
		response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        
        String userId = (String)request.getAttribute("userId");
        
        out.println("查询编号为" + userId + "的用户信息如下:");
        out.println("用户名为:张三");
        out.println("用户年龄为:20");
        /********** End **********/
    }

第4关:请求包含

  • 任务描述
    本关任务:编写一个 Servlet 请求之间转发数据的程序。

  • 相关知识
    完成本关需要具备的知识介绍请参见第三关卡。

  • 编程要求
    在右侧编辑器 Begin-End 之间补充代码,完成 UserServlet 向 OrderServlet 请求转发数据的程序,具体要求如下:

  1. 使用请求包含(include)的方式;
  2. 将 UserServlet 的访问路径设置为/UserServlet,并在类中输出用户名为:张三的信息到网页中;
  3. 当访问/UserServlet时转发至/OrderServlet;
  4. 在 UserServlet 中编写转发语句后再次编写一个输出语句到网页上,内容为:查询结束;
  5. 将 OrderServlet 的访问路径设置为/OrderServlet,并模拟获取用户张三对应的订单信息,即用输出语句将信息输出至网页。信息内容为:订单编号:001,订单内容:苹果手机。

具体的输出信息请参考测试说明中图片内容

web.xml:

<!-- ********** Begin ********** -->
	... ...
	
   <servlet-mapping>
      <servlet-name>UserServlet</servlet-name>
      <url-pattern>/UserServlet</url-pattern>
   </servlet-mapping>

   <servlet-mapping>
      <servlet-name>OrderServlet</servlet-name>
      <url-pattern>/OrderServlet</url-pattern>
   </servlet-mapping>
 <!-- ********** End ********** -->

UserServlet.java

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /********** Begin **********/
        PrintWriter out = response.getWriter();
        out.println("用户名为:张三");
        request.getRequestDispatcher("/OrderServlet").include(request, response);
        out.println("查询结束");
        /********** End **********/
    }

OrderServlet.java

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /********** Begin **********/
        PrintWriter out = response.getWriter();
        out.println("订单编号:001");
        out.println("订单内容:苹果手机");
        /********** End **********/
    }

Java生成验证码

第1关:使用Servlet生成验证码

  • 任务描述
    本关任务:使用servlet生成验证码。

  • 相关知识

  • 编程要求
    web.xml中的代码已经添加,按照上述步骤编写servlet代码,点击测评即可。

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    /********* Begin *********/
    //请在此编写生成验证码的代码
    // 定义图像数据缓冲区
    // 定义图片的宽高
    int height = 20;
    int width = 60;
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    // 绘图工具
    Graphics graphics = image.getGraphics();
    // 绘制矩形
    graphics.setColor(getRandColor());
    // 绘制矩形背景 前两个参数 是 x y的坐标
    graphics.fillRect(0, 0, width, height);
    // 设置文字的颜色 为白色
    graphics.setColor(Color.WHITE);
    String yzm = "";
    // 生成四个随机数字并且画在图片上
    for (int i = 1; i <= 4; i++) {
        // 生成随机数字并且显示到页面上
        int number = new Random().nextInt(10);
        yzm += number;
        graphics.drawString(number + "", 10 * i, 10);
    }
    // 将验证码放入Httpsession中
    HttpSession session = req.getSession();
    session.setAttribute("sessionYzm", yzm);
    // 将验证码图片输出到客户端
    ImageIO.write(image, "jpg", resp.getOutputStream());
    /********* End *********/
    }

第2关:用户登录时校验验证码是否正确

  • 任务描述
    本关任务:编写程序验证验证码是否正确。

  • 相关知识
    上一关我们已经学习如何生成验证码了,为了完成一整套的验证码使用流程我们还需要知道如何验证用户提交的验证码是否正确。

  • 编程要求
    好了,该你啦,使用本关所学内容,完成登录的校验,具体要求如下:

  1. 首先实现验证码校验的功能,当验证码填写错误的时候,给前端返回数据“验证码错误”;
  2. 当用户名为admin,密码为admin123时可以登录成功,返回“登录成功”,其他情况返回“登录失败”;
  3. 前端页面已经编写完成,你需要编写的是后端代码。
  • 测试说明
    本次实训使用的是junit+cactus框架进行测试,所有测试集通过即算通关。
   @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        /********* Begin *********/
		//请在此进行登录校验
        PrintWriter writer=resp.getWriter();
        String verifycode=req.getParameter("verifycode");
        String username=req.getParameter("username");
        String password=req.getParameter("password");
        HttpSession session=req.getSession();
        String realCode=(String) session.getAttribute("sessionYzm");
        if(verifycode!=null && verifycode.equals(realCode)){
           if("admin123".equals(password) && "admin".equals(username)){
               writer.write("登录成功");
           }else{
               writer.write("登录失败");
           }
        }else{
            writer.write("验证码错误");
        }
        /********* Begin *********/
    }

第3关:使用Kaptcha组件生成验证码

  • 任务描述
    本关任务:使用Kaptcha组件生成验证码,并校验验证码是否正确。

  • 相关知识
    之前两关我们已经了解了验证码的制作流程,不过我们在开发中一般不会去自己从零开始编写验证码,而是会使用到开源的组件,本关我们就来使用Kaptcha来生成验证码,并且编写一个页面校验用户的验证码是否输入正确。

  • 编程要求
    好了,到你啦,来使用Kaptcha生成验证码并校验输入的验证码是否正确吧。

  1. 补全captchacode.jsp,实现验证码表单的页面效果;
  2. 补全CheckCaptchaServlet,实现验证码的校验功能,验证码正确返回:验证码输入正确,否则返回:验证码输入错误。

captchacode.jsp

<!--------- Begin --------->
<script type="text/javascript">
    function reloadCode() {
        var date = new Date().getTime();
        document.getElementById("code").src = "<%=request.getContextPath() %>/imageKaptcha?d="+date;
    }
</script>

<form action="checkCaptcha.jsp" method = "post">
     <img alt="验证码" src="imageKaptcha" id = "code"><a href = "javascript:reloadCode();">看不清</a>
     <input type = "text" name = "captcha">
     <input type = "submit" value = "submit">
</form>
<!--------- End --------->

CheckCapchaServlet.java

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        /********* Begin *********/
        //校验kaptcha 验证码是否正确
        PrintWriter out = resp.getWriter();
        req.setCharacterEncoding("utf-8");
        // 获取Kaptcha jar包里面的KAPTCHA_SESSION_KEY
        HttpSession session=req.getSession();
        String trueCaptcha = (String)session.getAttribute(Constants.KAPTCHA_SESSION_KEY);
        String inputCaptcha = req.getParameter("captcha");
        if(trueCaptcha.toLowerCase().equals(inputCaptcha.toLowerCase())) {
        out.write("验证码输入正确");
        } else {
        out.write("验证码输入错误");
        }
        /********* End *********/
    }
posted @ 2023-09-29 14:52  你的脑子能压几个栈  阅读(503)  评论(0)    收藏  举报