/*
*jsp
*servlet/jsp是两种动态的web资源技术
*使用servlet可以生产一个前端页面,但是,非常麻烦,而且页面的调试和维护会非常麻烦
*response.getWriter().write(...);
*简介:java server pages java服务器端页面们,是在服务器端执行的。
*jsp可以写HTML+java+jsp自己的代码
*运行原理:jsp -- 翻译成servlet -- 编译 -- 访问
*jsp脚本元素(jsp页面可以编写java代码)
*<%! %>:定义类,变量,方法 成员变量
*<%= %>:输出语句(直接可以输出到页面)
*<% %> :定义变量,语句(循环,判断语句) 局部变量
*jsp页面注释
*HTML:
*一直存在
*java:大家都懂
*jsp文件的阶段存在,翻译成java文件之后也存在
*jsp注释:<%-- --%>
*只会存在于jsp文件的阶段,即翻译成java文件之后就不存在了
*jsp指令元素
*用于指示jsp执行某些步骤
用于指示jsp表现特定行为
*语法:<%@ 指令元素 属性名=属性值 %>
*page 设置jsp属性
*属性:可以单独使用或多个同时使用
用来定义jsp文件的全局属性
*language:jsp文件允许嵌入的语言,暂时只支持java
*extends:jsp翻译成servlet文件,servlet继承的类。
**session:默认为true,表示session可以直接使用
false,必须先获取再使用(一般不需要改变这个)
**import:引入java的jar包
*buffer:设置缓存区大小,默认8kb
*autoFlush:如果buffer溢出,true,自动刷新
false,发生异常
(一般不要修改)
*errorPage:指定错误页面
*isErrorPage:设置值(true|false)之后可以去使用exception对象,然后可以去获取异常信息
**contentType:设置浏览器打开文件时采用的编码方式
**pageEncoding:jsp翻译成servlet文件时采用的编码
**isELIgnored:是否忽略EL表达式(false,不能忽略,EL表达式很重要)
*import属性可以出现多次,其他属性只能出现一次
*include 包含页面(页面布局)
*语法:<%@ include file="要包含的文件的地址(静态包含)" %>
*静态包含的原理:
*在翻译之前.jsvs文件之前,会把全部的内容都复制在一起
一起翻译,一起编译,一起执行
*taglib 引入标签库
*语法:<%@ taglib uri="" prefix="" %>
*属性
*uri:引入标签库文件的名称
*prefix:标签库的前缀名
*jsp内置对象
内置对象 真实对象 方法
*request: HttpServletRequest setAttribute,getAttribute
*response: HttpServletResponse addCookie,getWriter
*session: HttpSession setAttribute,getAttribute
*application: ServletContext setAttribute,getAttribute
*out: JspWriter write,print
*eg:<%= "HELLO" %>
<% out.print("AAAA"); %>
<% response.getWriter().print("BBBB"); %>
<% out.print("CCCC"); %>
* 输出结果:BBBB HELLO AAAA CCCC
*HELLO AAAA CCCC都是由out对象输出的,BBBB是用printWriter对象输出的
而printWriter是由response对象提供的
out对象缓存区中的东西也是需要先输出到response对象缓存区的
所以直接存在于resource缓冲区中的BBBB最先输出
HELLO AAAA CCCC以及头部的HTML信息,都是后输出的。
只是关于HTML头部的那些信息我们不可见,只见到了HELLO AAAA CCCC
所以输出结果如上
*pageContext: PageContext setAttribute,getAttribute
*域对象
*自己存取值
*向其他域存取值
*setAttribute(name,value,scope)
*getAttribute(name)
*findAttribute(name)
*可以获取其他8个对象
*应用:编写框架或者其他通用性较高的代码
*page: Object 一般不使用这个对象
*一般代表当前页面对象
*config: ServletConfig getInitParameter, getInitParameterNames
*exception: Throwable getMessage
*和异常信息相关
*使用前提:把isErrorPage=true
*在jsp的时候
*application 整个web应用
*session 一次会话
*request 一次请求
*pageContext 当前页面
*jsp标签(jsp动作)
*用于在jsp页面上提供业务逻辑功能,避免在jsp页面中直接编写java代码,造成jsp页面难以维护
*把数据封装到javabean中
*
*javabean和内省
*javabean:遵循特定写法的java类,一个无参构造方法,私有化属性,对外提供getter和setter
用于封装数据
它的属性可以是任意类型的。属性可以只有getter或只有setter
*
*
*
//为javabean里面的属性赋值
||
//取出javabean里面的值
*转发
*
*page:要转发的页面
*页面的包含(动态)
*
*动态包含时间较长,因为没一个文件都会翻译成自己的.java文件,再编译成.class文件 然后再把结果复制到一起,对外显示。 *参数的传递 *
*name:属性名 value:属性值 *内省:Introspector,基于反射 *beanutils: **成员变量:在类中的方法外,存在于堆内存中,随着对象的创建而存在,随着对象的消失而消失,有默认初始化值 局部变量:在方法中或方法声明上,存在于栈内存,随着方法的调用而存在,随着方法调用完毕而消失,没有默认初始化值,必须定义,赋值,然后使用 *EL表达式 eg:获取域对象中的内容 request。setAttribute("xx","yy"); *写法:$(xx); *执行运算 *获取域对象中的值 *获取web开发中的对象 *pageScope *requestScope *sessionScope *applicationScope *param 获取请求的参数 getParameter() *paramValues 获取请求的参数 getParameterValues() *header 获取请求头的信息 *headerValues 获取请求头的信息 *initParam 获取全局的初始化参数 *cookie 获取cookie *pageContext对象 *会话技术 *会话:从打开一个浏览器,打开网页,浏览信息,期间可以多次浏览网页,点击多个超链接,再关闭浏览器的过程 *要解决的问题 *每个用户与服务器交互的过程中,格子会有一些数据,程序要想办法保存每个用户的额数据 *cookie:客户端技术 *程序把每个用户的数据以cookie的形式写到用户各自的浏览器 当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去 *显示上次的访问时间 *如果是第一次访问,输出欢迎 如果不是第一次,就输出上次的访问时间 *判断是否是第一次访问: *通过制定名称来查找,如果没找到,就是第一次访问 *回写到浏览器 *addCookie(Cookie cookie):Cookie(name,value) *获取cookie内容 *Cookie[] getCookies() *cookie的常用API: *构造方法:Cookie(name,value) *String getName() 获取cookie名称 *String getValue() 获取cookie值 *void setMaxAge(int expiry) 设置有效时间 *失效cookie:setMaxAge(0): 前提:设置有效路径,必须和之前设置过的相同 *void setPath(String uri) 设置有效域名 *void setDomain() 设置有效路径 *会话级别的cookie:默认将cookie保存到浏览器的内存中 *持久的cookie:将cookie保存到哦磁盘上,通过setMaxAge设置 *浏览器一般只允许存放300个,每个站点最多20个,每个cookie大小限制为4kb *session:服务端技术 *服务器在运行时可以为每一个用户浏览器创建一个独享的session对象 由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中 当用户去访问服务器中的其他数据时,其他web资源再从用户格子的session中取出数据为用户服务 *cookie是基于客户端,不安全,并且有大小和个数的限制 *于cookie的区别:cookie把用户的数据写给用户的浏览器 session是把用户的数据写到用户独占的session中 *session是域对象,返回是一次会话的范围,存放于每个用户自己相关的数据 *setAttribute() 获取session中存放的数据 *getAttribute() 存放数据 *getId() 获取session唯一的id *invalidate() 销毁session */
商品页
<%@ page language="java" contentType="text/html; charset=utf-8"%>
Insert title here
手电筒加入购物车
冰箱加入购物车
电视加入购物车
洗衣机加入购物车
电脑加入购物车
/*
* 逻辑处理页
*/
package cn.itcast.khl.testcode;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
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;
@WebServlet("/CheckCode")
public class CheckCode extends HttpServlet
{
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
/*
* 在内存中生产图片,但是没有设置背景颜色的方法,即填充的矩形,并且和纸的大小相同,然后给矩形设置颜色
* 获取笔的对象(设置颜色,字体,画字符串,画矩形)
* 先准备好数据,英文字母大小写和数字的结合,把字符串画到画布上
* 画干扰线
* 把内存中的图片输出到客户端
*/
final int width=120;
final int height=30;
//在内存中生产图片,默认黑色
BufferedImage image=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//先获取画笔对象
Graphics2D graphics=(Graphics2D) image.getGraphics();
//设置灰色
graphics.setColor(Color.GRAY);
//画一个可以填充画布的矩形
graphics.fillRect(0, 0, width, height);
//设置颜色
graphics.setColor(Color.BLUE);
//画边框
graphics.drawRect(0, 0, width-1, height-1);
//准备数据,随机获取四个字符
String words="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
//设置字体颜色
graphics.setColor(Color.RED);
//设置字体
graphics.setFont(new Font("隶书", Font.BOLD, 20));
//随机获取下标
Random random=new Random();
int x=20;
int y=20;
for(int i=0;i<4;i++)
{
//void rotate(double theta,double x,double y)
//theta:弧度=角度*Math.PI/180
int degree=random.nextInt(60)-30;
double hudu=degree*Math.PI/180;
graphics.rotate(hudu,x,y);
int index=random.nextInt(words.length());
//返回指定下标位置的字符
char ch=words.charAt(index);
graphics.drawString(""+ch , x , y);
graphics.rotate(-hudu,x,y);
x+=20;
}
//画干扰线
int x1,x2,y1,y2;
for(int i=0;i<4;i++)
{
x1=random.nextInt(width);
y1=random.nextInt(height);
x2=random.nextInt(width);
y2=random.nextInt(height);
graphics.drawLine(x1, y1, x2, y2);
graphics.setColor(Color.GREEN);
}
//输出到客户端
ImageIO.write(image, "jpg", response.getOutputStream());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGet(request, response);
}
}
<%@page import="java.util.Set"%>
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=utf-8"%>
结算页面
<%
//获取购物车,把购物车中的商品信息和数量显示到页面上
Map
car=(Map
)request.getSession().getAttribute("car");
//如果购物车不为空,循环遍历
if(car!=null)
{
//遍历map
Set
keySet= car.keySet();
//遍历keySet,拿出商品名称
for(String key:keySet)
{
%>
亲,您购买的商品是:<%=key %>,数量是:<%=car.get(key) %>
<%
}
}
else
{
%>
亲,您还没有购买任何商品,请您继续败家吧!
<%
}
%>
加油,秋招,我一定可以的。