笔记-JavaWeb学习之旅13
验证码案列
昨天晚上出现的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.pageScope 2.requestScope 3.sessionScope 4.applicationScope
- ${键名}:表示依次从最小的域中查找是否有该键对应的值,知直到找到为止,如果域有多个同名的键,则从小范围的域开始找起。
获取对象,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的更多相关文章
- 笔记-JavaWeb学习之旅5
CP30的演示 package cn.itcast.datasourcejdbc; import com.mchange.v2.c3p0.ComboPooledDataSource; import j ...
- 笔记-JavaWeb学习之旅7
JavaScript基础 概念:一门客户端脚本语言,运行在客户端浏览器中,每一个浏览器都有JavaScript的解析引擎,是一个脚本语言,不需要编译,直接就可以被浏览器解析执行. JavaScript ...
- 笔记-JavaWeb学习之旅19
Redis:redis是一款高性能的NOSQL系列的非关系型数据库 NOSQL: Not Only SQL ,意即"不仅仅是SQL",是一项全新的数据库理念,泛指非关系型数据库 r ...
- 笔记-JavaWeb学习之旅18
AJAX:ASynchronous JavaScript And XML 异步的JavaScript 和XML 异步和同步:客户端和服务器端相互通信的基础上 同步:客户端操作后必须等待服务器端的响应, ...
- 笔记-JavaWeb学习之旅17
1.过滤选择器 首元素选择器:first 获得选择的元素中的第一个元素 尾元素选择器:last获得选择元素中的最后一个元素 非元素选择器:not(selector) 不包括指定内容的元素 偶数选择器: ...
- 笔记-JavaWeb学习之旅16
增强对象的功能 动态代理:在内存中形成代理类 实现步骤: 代理对象和真实对象实现相同的接口 代理对象 = Proxy.newProxyInstance(); 使用代理对象调用真实对象的方法 增强方法 ...
- 笔记-JavaWeb学习之旅15
Filter:过滤器 概念:当访问服务器的资源是,过滤器可以将请求拦截下来,完成一些特殊的功能 快速入门: 步骤: 定义一个类,实现接口Filter 复写方法 配置拦截路径 package com.d ...
- 笔记-JavaWeb学习之旅14
JSTL:JavaServer Pages Tag Library JSP标准标签库 if标签 <%@ page import="java.util.ArrayList" % ...
- 笔记-JavaWeb学习之旅10
Servlet server applet运行在服务器端的小程序,servlet就是一个接口,定义了Java类被浏览器访问到的规则(Java类重写这个接口,就可以被浏览器(tomcat)识别) Ser ...
随机推荐
- Go Concurrency Patterns: Timing out, moving on
https://blog.golang.org/go-concurrency-patterns-timing-out-and
- xmanager 5图文使用教程
1.Xconfig xconfig是linux下X Window环境中用于配制的一个工具,和menuconfig相似,但用法更友好方便. 当你创建一个会话,会话分配一个默认的配置文件.Xmanager ...
- SOAP Only Authentication Using C#
Jason Lattimer's Blog Monday, February 9, 2015 SOAP Only Authentication ...
- ssh服务配置文件---sshd_config详解
关于 SSH Server 的整体设定,包含使用的 port 啦,以及使用的密码演算方式 Port 22 # SSH 预设使用 22 这个 port,您也可以使用多的 port ! # 亦即重复使 ...
- 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 ...
- 详细阐述ping命令中请求超时与无法访问的区别
1.Request timed out 这是大家经常碰到的提示信息,很多文章中说这是对方机器置了过滤ICMP数据包,从上面工作过程来看,这是不完全 正确的,至少有下几种情况. (1) 对方已关机,或者 ...
- iOS 使用.xcworkspace文件管理代码和工程依赖(实现项目模块化)
一.创建xcworkspace文件. 在cocoapods安装后,项目文件里都会多一个后缀为.xcworkspace的文件.打开这个文件就相当打开最初创建的项目了.那么这个文件也就是用来管理项目的,它 ...
- codeforces A. Fox and Box Accumulation 解题报告
题目链接:http://codeforces.com/problemset/problem/388/A 题目意思:有 n 个 boxes,每个box 有相同的 size 和 weight,但是stre ...
- sipp 对asterisk 进行压力测试
测试环境 asterisk 192.168.106.170 版本astrisk1.8 sipp 192.168.106.141 sipp版本3.3 安装依赖包yum install make g ...
- MongoDB复制集高可用选举机制(三)
复制集高可用选举机制 在上一章介绍了MongoDB的架构,复制集的架构直接影响着故障切换时的结果.为了能够有效的故障切换,请确保至少有一个节点能够顺利升职为主节点.保证在拥有核心业务系统的数据中心中拥 ...