验证码案列

昨天晚上出现的500错误原因在于验证码没有获取到,获取验证码是应该获取的是共享域中的验证码,而我把获取值得键给写成了jsp中的键,而不是内存生成图片中,然后把图片上传到共享域中的键。这两个键搞混了,所以获取不到验证码。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>login</title> <script>
window.onload = function(){
document.getElementById("img").onclick = function(){
this.src="/day14/checkCodeDemo4?time="+new Date().getTime();
}
} </script>
<style>
div{
color: red;
} </style>
</head>
<body> <form action="/day14/loginServlet" method="post">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td>验证码</td>
<td><input type="text" name="checkCode"></td>
</tr>
<tr>
<td colspan="2"><img id="img" src="/day14/checkCodeDemo4"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="登录"></td>
</tr>
</table> </form> <div><%=request.getAttribute("cc_error") == null ? "" : request.getAttribute("cc_error")%></div>
<div><%=request.getAttribute("login_error") == null ? "" : request.getAttribute("login_error") %></div> </body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body> <h1><%=request.getSession().getAttribute("user")%>,欢迎您</h1> </body>
</html>
package com.data;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random; @WebServlet("/checkCodeDemo4")
public class checkCode extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
} @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int width = 100;
int height = 50;
//创建对象,该对象可以在内存中生成图片
//BufferedImage是Image的一个子类,Image和BufferedImage的主要作用就是将一副图片加载到内存中。
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//这个类第一次接触,好陌生,好抽象
//图片加载进内存了,就尽情的虐待他吧
//美化图片
//填充背景色
Graphics g = image.getGraphics();
g.setColor(Color.PINK);
g.fillRect(0,0,width,height);
//画边框
g.setColor(Color.BLUE);
g.drawRect(0,0,width-1,height-1);
String str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; // 写验证码
Random ran = new Random();
StringBuilder sb = new StringBuilder();//初始容量为16字节
//随机生成4个字符
for(int i = 1;i<=4;i++){
int index = ran.nextInt(str.length());
char ch = str.charAt(index);
sb.append(ch);//这个方法可以接收任意类型的数据
g.drawString(ch+"",width/5*i,height/2);//ch代表要绘制的字符,x,y代表绘制的坐标
}
String value_checkCode_session = sb.toString();//把字符变成字符串
System.out.println(value_checkCode_session);
//创建对象,使用方法将验证码存入session
req.getSession().setAttribute("key_checkCode_session",value_checkCode_session);//把数据放入共享域
g.setColor(Color.GREEN);//线条的颜色
//画10条干扰线
for (int i = 0 ; i< 10 ;i++){
int x1 = ran.nextInt(width);
int x2 = ran.nextInt(width); int y1 = ran.nextInt(height);
int y2 = ran.nextInt(height);
g.drawLine(x1,y1,x2,y2);//参数是坐标
} //将图片输出到页面上
ImageIO.write(image,"jpg",resp.getOutputStream()); }
}
package com.data;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException; @WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//根据键获取值
String username = request.getParameter("username");
String password = request.getParameter("password");
String checkCode = request.getParameter("checkCode");//这里的checkCode是用户输入的验证码
//要先看看获取的验证码是否正确
//先得取得内存中生成的验证码,
HttpSession session = request.getSession();//创建HttpSession对象
String checkCode1 = (String)session.getAttribute("key_checkCode_session");//这里的checkCode是内存中获得的验证码
//把获得的验证码删除,确保只使用一次
session.removeAttribute("checkCode_session");
//判断验证码是否正确,忽略大小写
if(checkCode1!=null&&checkCode1.equalsIgnoreCase(checkCode)){
//验证码正确
//判读用户名和密码是否一致
if("zhangsan".equals(username)&&"123".equals(password)){
//存储信息,
session.setAttribute("user",username);
//重定向到success.jsp页面
response.sendRedirect(request.getContextPath()+"/success.jsp"); }else{
//储存信息到request
request.setAttribute("login_error","用户名或密码错误");
//转发都登录页面
request.getRequestDispatcher("/login.jsp").forward(request,response);
}
} else{
//验证码不一致
//存储提示信息到request
request.setAttribute("cc_error","验证码错误,请重试");
//转发到登录页面
request.getRequestDispatcher("/login.jsp").forward(request,response);
} } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
JSP:

1.指令

作用:用于配置JSP页面,导入资源文件

格式:<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ...%>

指令分类:

1.page :配置JSP页面的

  • contentType:等同于response.setContentType(),设置响应体的mime类型
  • import:导包
  • errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
  • isErrorPage:标识当前是否是错误页面,true,是,可以使用内置对象exception,false:否,默认值,不可以设置内置对象exception

2.include:页面包含的,导入页面的资源文件

  • <% @include file="要导入的资源文件名称"%>

3.taglib :导入资源

  • <%@ taglib prefix="c" uri="文件的地址" %>
  • prefix :前缀,自定义的

2.注释:

  • html注释:只能注释html代码片段
  • jsp注释:<%-- --%>可以注释所有
3.内置对象

在jsp页面中不需要创建,直接使用的对象,一共有9个

变量名 真实类型 作用
pageContext PageContext 当前页面共享数据,还可以获取其他八个内置对象
request HttpServletRequest 一次请求访问的多个资源
session HttpSession 一次会话的多个请求间
application ServletContext 所有用户间共享数据
response HttpServletResponse 响应对象
page Object 当前页面的对象
out jspWriter 输出对象,数据输出到页面上
config ServletConfig Servlet的配置对象
exception Throwable 异常对象
MVC:开发模式 模型视图控制器

M:Model,模型。JavaBean,完成具体的业务操作,如,查询数据库,封装对象

V:view,视图,JSP,展示数据

C:Controller,控制器。Servlet,获取用户输入,调用模型,将数据交给视图进行展示

EL表达式:

1.概念:Expression Language 表达式语言

2.作用:替换和简化jsp页面中java代码的编写

3.语法:${表达式}

4.注意:jsp默认支持el表达式,浏览器会解析el表达式,如果让浏览器忽略jsp页面中所有的el表达式可以设置jsp中page指令中:isELIgnored="true"会 忽略当前jsp页面中所有的el表达式,或者使用${表达式}:会忽略当前这个el表达式。

EL_表达式获取域中的值

1.el表达式只能从域对象中获取值

2.语法:

  1. ${域名称.键名}:从指定域中获取指定键的值

    • 有四种域
    • 1.pageScope 2.requestScope 3.sessionScope 4.applicationScope
  2. ${键名}:表示依次从最小的域中查找是否有该键对应的值,知直到找到为止,如果域有多个同名的键,则从小范围的域开始找起。
获取对象,List集合,Map集合的值

对象格式:${域名称.键名.属性名}

List集合格式:${域名称.键名[索引]}

Map集合格式:${域名称.键名.key名称}或者${域名称.键名["key名称"]}

package com.data.jsp;
import java.text.SimpleDateFormat;
import java.util.Date; public class User {
private String name;
private int age;
private Date birthday;
//逻辑视图
//需要显示年月日的日期格式需要创建一个方法
public String getBirStr(){
//格式化日期
if(birthday !=null){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
//返回字符串
return sdf.format(birthday);
}else{
return "";
}
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
<%@ page import="com.data.jsp.User" %>
<%@ page import="java.util.*" %><%--
Created by IntelliJ IDEA.
User: Yuan
Date: 2019/6/11
Time: 18:20
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--给User设置值--%>
<%
User user = new User();
user.setName("张三");
user.setAge(23);
user.setBirthday(new Date());
// 共享域
request.setAttribute("u",user);
//创建List集合
List list = new ArrayList();
list.add("云想衣裳花想容");
list.add("春风扶槛露华浓");
// 添加对象进去看看
list.add(user);
request.setAttribute("list",list); //创建Map集合
Map map = new HashMap();
map.put("sname","李四");
map.put("gender","男");
//添加用户进去看看
map.put("user",user);
request.setAttribute("map",map);
%>
<h3>el获取对象中的值</h3>
<%--获取对象的值需要通过对象的方法来获取--%>
<%--setter或getter方法,去掉set或get,在将剩余部分,首字母变小写--%>
${requestScope.u.name}<br>
${requestScope.u.age}<br>
${requestScope.u.birthday}<br>
${requestScope.u.birStr}<br>
<h3>el获取List集合中的值</h3>
${requestScope.list}<br><%--获取的是整个集合--%>
${requestScope.list[0]}<br>
${requestScope.list[1]}<br>
${requestScope.list[2].name}<br>
${requestScope.list[2].age}<br>
<h3>el获取Map集合中的值</h3>
${requestScope.map}<br>
${requestScope.map.sname}<br>
${requestScope.map.gender}<br>
${requestScope.map.user.name}<br>
</body>
</html>

空运算符:empty

功能:用于判断字符串,集合,数组对象是否为null并且长度是否为0

格式:{empty list}

3.隐式对象:

el表达式中有11个隐式对象

pageContext:获取jsp其他八个内置对象

${pageContext.request.contextPath}:动态获取虚拟目录

笔记-JavaWeb学习之旅13的更多相关文章

  1. 笔记-JavaWeb学习之旅5

    CP30的演示 package cn.itcast.datasourcejdbc; import com.mchange.v2.c3p0.ComboPooledDataSource; import j ...

  2. 笔记-JavaWeb学习之旅7

    JavaScript基础 概念:一门客户端脚本语言,运行在客户端浏览器中,每一个浏览器都有JavaScript的解析引擎,是一个脚本语言,不需要编译,直接就可以被浏览器解析执行. JavaScript ...

  3. 笔记-JavaWeb学习之旅19

    Redis:redis是一款高性能的NOSQL系列的非关系型数据库 NOSQL: Not Only SQL ,意即"不仅仅是SQL",是一项全新的数据库理念,泛指非关系型数据库 r ...

  4. 笔记-JavaWeb学习之旅18

    AJAX:ASynchronous JavaScript And XML 异步的JavaScript 和XML 异步和同步:客户端和服务器端相互通信的基础上 同步:客户端操作后必须等待服务器端的响应, ...

  5. 笔记-JavaWeb学习之旅17

    1.过滤选择器 首元素选择器:first 获得选择的元素中的第一个元素 尾元素选择器:last获得选择元素中的最后一个元素 非元素选择器:not(selector) 不包括指定内容的元素 偶数选择器: ...

  6. 笔记-JavaWeb学习之旅16

    增强对象的功能 动态代理:在内存中形成代理类 实现步骤: 代理对象和真实对象实现相同的接口 代理对象 = Proxy.newProxyInstance(); 使用代理对象调用真实对象的方法 增强方法 ...

  7. 笔记-JavaWeb学习之旅15

    Filter:过滤器 概念:当访问服务器的资源是,过滤器可以将请求拦截下来,完成一些特殊的功能 快速入门: 步骤: 定义一个类,实现接口Filter 复写方法 配置拦截路径 package com.d ...

  8. 笔记-JavaWeb学习之旅14

    JSTL:JavaServer Pages Tag Library JSP标准标签库 if标签 <%@ page import="java.util.ArrayList" % ...

  9. 笔记-JavaWeb学习之旅10

    Servlet server applet运行在服务器端的小程序,servlet就是一个接口,定义了Java类被浏览器访问到的规则(Java类重写这个接口,就可以被浏览器(tomcat)识别) Ser ...

随机推荐

  1. Go Concurrency Patterns: Timing out, moving on

    https://blog.golang.org/go-concurrency-patterns-timing-out-and

  2. xmanager 5图文使用教程

    1.Xconfig xconfig是linux下X Window环境中用于配制的一个工具,和menuconfig相似,但用法更友好方便. 当你创建一个会话,会话分配一个默认的配置文件.Xmanager ...

  3. SOAP Only Authentication Using C#

                Jason Lattimer's Blog                 Monday, February 9, 2015 SOAP Only Authentication ...

  4. ssh服务配置文件---sshd_config详解

     关于 SSH Server 的整体设定,包含使用的 port 啦,以及使用的密码演算方式 Port 22 # SSH 预设使用 22 这个 port,您也可以使用多的 port !  # 亦即重复使 ...

  5. Codeforces Round #373 (Div. 2) C. Efim and Strange Grade —— 贪心 + 字符串处理

    题目链接:http://codeforces.com/problemset/problem/719/C C. Efim and Strange Grade time limit per test 1 ...

  6. 详细阐述ping命令中请求超时与无法访问的区别

    1.Request timed out 这是大家经常碰到的提示信息,很多文章中说这是对方机器置了过滤ICMP数据包,从上面工作过程来看,这是不完全 正确的,至少有下几种情况. (1) 对方已关机,或者 ...

  7. iOS 使用.xcworkspace文件管理代码和工程依赖(实现项目模块化)

    一.创建xcworkspace文件. 在cocoapods安装后,项目文件里都会多一个后缀为.xcworkspace的文件.打开这个文件就相当打开最初创建的项目了.那么这个文件也就是用来管理项目的,它 ...

  8. codeforces A. Fox and Box Accumulation 解题报告

    题目链接:http://codeforces.com/problemset/problem/388/A 题目意思:有 n 个 boxes,每个box 有相同的 size 和 weight,但是stre ...

  9. sipp 对asterisk 进行压力测试

    测试环境 asterisk  192.168.106.170 版本astrisk1.8 sipp   192.168.106.141 sipp版本3.3 安装依赖包yum install make g ...

  10. MongoDB复制集高可用选举机制(三)

    复制集高可用选举机制 在上一章介绍了MongoDB的架构,复制集的架构直接影响着故障切换时的结果.为了能够有效的故障切换,请确保至少有一个节点能够顺利升职为主节点.保证在拥有核心业务系统的数据中心中拥 ...