Js和jQuery分别实现分类商品和是否热门
同步和异步
同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发第二个请求
异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求
JS原生的Ajax技术
function fn1(){
//1、创建ajax引擎对象
var xmlHttp = new XMLHttpRequest();
//2、绑定监听
xmlHttp.onreadystatechange = function(){
if(xmlHttp.readyState==4&&xmlHttp.status==200){
//5、接受相应数据
var res = xmlHttp.responseText;
document.getElementById("span1").innerHTML = res;
}
}
//3、绑定地址
xmlHttp.open("GET","${pageContext.request.contextPath }/ajaxServlet",true);
//4、发送请求
xmlHttp.send();
}
post访问要在send前复制这句
xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
get方式:请求参数在url后边拼写,send方法为空参 xmlHttp.open("GET","${pageContext.request.contextPath }/ajaxServlet?username=tom",true);
post方式:请求参数在send方法中定义 xmlHttp.send("username=tom");
true表示异步,false表示同步
Json是一种与语言无关的数据交换格式
作用:使用Ajax进行前后台数据交换,移动端与服务端的数据交换
Json的两种格式:
Json的key是字符串,value是object
获取数据:
json对象.键名
json对象["键名"]
数组对象[索引]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
获取person对象中所有的键和值
Jquery的Ajax技术
ajax的get和post的区别:
post不会乱码,get需要编解码,但是post编解码反而出错
$.get(url, [data], [callback], [type])
$.post(url, [data], [callback], [type])
$.ajax( { option1:value1,option2:value2... } );
常用的option有如下:
async:是否异步,默认是true代表异步
data:发送到服务器的参数,建议使用json格式
dataType:服务器端返回的数据类型,常用text和json
success:成功响应执行的函数,对应的类型是function类型
type:请求方式,POST/GET
url:请求服务器端地址
//使用json的转换工具将对象或集合转成json格式的字符串
Jsonlib:JSONArray(集合) JSONObject(单一对象)
Gson:对象和集合都是同一个方法
jackson的使用(jackson核心对象ObjectMapper)
1.JSON转为Java对象
readValue(json字符串数据,Class)
2.Java对象转为JSON
writeValue(参数1,obj):
writeValueAsString(obj)
注解:
@JsonIgnore:排除属性
@JsonFormat:属性值的格式化
复杂的java对象转换
list:数组
map:对象格式一致
public class Demo {
//Java对象转为JSON字符串
@Test
public void show1() throws Exception{
Person p=new Person();
p.setName("张三");
p.setAge(20);
p.setGender("男");
ObjectMapper mapper=new ObjectMapper();
/*
转换方法:
writeValue(参数1,obj):
参数1:
File:将obj对象转换为JSON字符串,并保存到指定的文件中
Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字节输出流中
writeValueAsString(obj):将对象转为json字符串
*/
String json=mapper.writeValueAsString(p);
System.out.println(json);
//{"name":"张三","age":20,"gender":"男"}
//writeValue,将数据写到d://a.txt文件中
//mapper.writeValue(new File("d://a.txt"),p);
//writeValue.将数据关联到Writer中
//mapper.writeValue(new FileWriter("d://b.txt"),p);
}
}
监听器Listener
8大监听器(6+2)
3大域的监听器 ServletRequest HttpSession ServletContex
与session有关的监听器(对象感知监听器)
session中的对象有4种状态
绑定状态:将对象被放到session域中
解绑状态:将对象从session域中移除了
钝化状态:是将session内存中的对象持久化(序列化)到磁盘
活化状态:就是将磁盘上的对象再次恢复到session内存中
绑定与解绑的监听器HttpSessionBindingListener,不需要再web.xml里面配置
钝化与活化的监听器HttpSessionActivationListener 要记得实现serializable
2)监听器的编写步骤(重点):
<listener>
<listener-class>listener-class>
listener>
ServletContexListener监听器的作用:
初始化资源:加载数据库和spring的配置文件
任务调度:定时器 Timer/TimerTask
前六个监听器需要配置,但是对象感知监听器不需要配置
下面这个看看就行了,通过配置文件的方式
1分钟访问就会被钝化,然后再次访问就会被激活了 (在原有钝化基础上起作用)
邮箱服务器
邮件发送的协议:
协议:就是数据传输的约束
发送邮件的协议:SMTP 接受邮件的协议:POP3
过滤器filter
写一个类实现filter接口
实现方法(着重实现doFilter方法)
在web.xml里面配置(主要对哪些资源拦截)
放行 chain.doFilter(request, response);
注解:在类上添加 /* 拦截所有
@WebFilter("/*") //访问所有的资源之前,多会执行该过滤器
获取任何位置
类.class.getClassLoader().getResource(“”).getPath()
过滤器:一般用于完成通用的操作,如:登录验证,统一编码处理,敏感字符过滤
可以增强参数 返回值 方法体的逻辑
代理对象
public class ProxyTest {
public static void main(String[] args) {
//1.创建真实对象
Lenovo lenovo = new Lenovo();
//2.动态代理增强lenovo对象
/*
三个参数:
1. 类加载器:真实对象.getClass().getClassLoader()
2. 接口数组:真实对象.getClass().getInterfaces()
3. 处理器:new InvocationHandler()
*/
SaleComputer proxy_lenovo = (SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() {
/*
代理逻辑编写的方法:代理对象调用的所有方法都会触发该方法执行
参数:
1. proxy:代理对象
2. method:代理对象调用的方法,被封装为的对象
3. args:代理对象调用的方法时,传递的实际参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/*System.out.println("该方法执行了....");
System.out.println(method.getName());
System.out.println(args[0]);
*/
//判断是否是sale方法
if(method.getName().equals("sale")){
//1.增强参数
double money = (double) args[0];
money = money * 0.85;
System.out.println("专车接你....");
//使用真实对象调用该方法
String obj = (String) method.invoke(lenovo, money);
System.out.println("免费送货...");
//2.增强返回值
return obj+"_鼠标垫";
}else{
Object obj = method.invoke(lenovo, args);
return obj;
}
}
});
//3.调用方法
/* String computer = proxy_lenovo.sale(8000);
System.out.println(computer);*/
proxy_lenovo.show();
}
}
结果:
辅助理解
打印的结果
在src下面放一个文件,里面放敏感词汇
/**
* 敏感词汇过滤器
*/
@WebFilter("/*")
public class SensitiveWordsFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//1.创建代理对象,增强getParameter方法
ServletRequest proxy_req = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//增强getParameter方法
//判断是否是getParameter方法
if(method.getName().equals("getParameter")){
//增强返回值
//获取返回值
String value = (String) method.invoke(req,args);
if(value != null){
for (String str : list) {
if(value.contains(str)){
value = value.replaceAll(str,"***");
}
}
}
return value;
}
//判断方法名是否是 getParameterMap
//判断方法名是否是 getParameterValue
return method.invoke(req,args);
}
});
//2.放行
chain.doFilter(proxy_req, resp);
}
private List list = new ArrayList();//敏感词汇集合
public void init(FilterConfig config) throws ServletException {
try{
//1.获取文件真实路径
ServletContext servletContext = config.getServletContext();
String realPath = servletContext.getRealPath("/WEB-INF/classes/敏感词汇.txt");
//2.读取文件
BufferedReader br = new BufferedReader(new FileReader(realPath));
//3.将文件的每一行数据添加到list中
String line = null;
while((line = br.readLine())!=null){
list.add(line);
}
br.close();
System.out.println(list);
}catch (Exception e){
e.printStackTrace();
}
}
public void destroy() {
}
}
问题
1.使用jdbc的事务来操作数据库
2.使用dbutils的事务来操作数据库
3.使用三层架构完成转账的操作 1)先写没有事务的 2)然后写个事务的 发现结果还对 3)在转账之间写个i=1/0,控制台报错就对了
4.修改ul下面的li的值
5.使用原生ajax来访问
6.使用原生ajax来访问 并且生成随机数放在后面随机数
7.使用原生ajax来访问 分别用get和post方式来传数据
8.将json格式里面的java对象描述 为json格式的并取值
9.使用get和post方式返回字符串
10.使用get和post方式返回对象
11.使用ajax方式访问服务器返回json对象的字符串
12.异步校验用户名是否存在
12.2:站内搜索(鼠标抬起的时候,会自动去数据库查询)
13.写一个监听器并且写一个银行计息
14.使用ServletContextAttributeListener来监听属性的变化
15.测试感知监听器HttpSessionBindingListener的绑定与解绑
16.测试感知监听器HttpSessionActivationListener的钝化和活化
17.使用监听器定时完成定时发送生日祝福
18.filter快速入门
19.自动登录 有个过滤器 如果带了username和password的cookie 那么就用filter来增强
怎么解决用户名是中文的情况 由于cookie不能有中文 先编码然后在解码
20.校验用户名是否存在
1.使用jdbc的事务来操作数据库
public class Answer1 {
@Test
public void show1(){
Connection conn=null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql:///javaweb_day3","root","root");
//使用jdbc手动开启事务
conn.setAutoCommit(false);
String sql="update shiwu set name='zs' where id=1 ";
Statement stat=conn.createStatement();
int count=stat.executeUpdate(sql);
if(count>0){
System.out.println("修改数据成功");
//提交事务
conn.commit();
}
} catch (Exception e) {
try {
//回滚事务
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}
}
}
2.使用dbutils的事务来操作数据库
public class Answer2 {
@Test
public void show() {
QueryRunner qr=new QueryRunner();
String url="com.mysql.jdbc.Driver";
String user="root";
String password="root";
String sql="update shiwu set name='zhangsan' where id=1 ";
Connection conn=null;
try {
conn = DriverManager.getConnection(url,user,password);
//开启事务
conn.setAutoCommit(false);
qr.update(conn, sql);
//提交事务
conn.commit();
} catch (SQLException e) {
//回滚事务
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}
}
}
3.使用三层架构完成转账的操作
public class TransferServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
String out=request.getParameter("out");
String in=request.getParameter("in");
String stringMoney=request.getParameter("money");
double money=Double.parseDouble(stringMoney);
System.out.println(out+in+money);
TransferService service=new TransferService();
boolean flag=service.transfer(out,in,money);
if(flag){
response.getWriter().write("恭喜你转账成功");
}else{
response.getWriter().write("您转账失败!!");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
public class TransferService {
String url="jdbc:mysql:///javaweb_day3";
String user="root";
String password="root";
Connection conn=null;
boolean flag=true;
static{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (Exception e) {
e.printStackTrace();
}
}
public boolean transfer(String out, String in, double money) {
TransferDao dao=new TransferDao();
try {
conn=DriverManager.getConnection(url, user, password);
//开启事务
conn.setAutoCommit(false);
dao.out(conn,out,money);
int i=1/0;
dao.in(conn,in,money);
} catch (Exception e) {
flag=false;
//回滚事务
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally{
//提交事务
try {
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
}
}
return flag;
}
}
public class TransferDao {
public void out(Connection conn, String out, double money) throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "update shiwu set money=money-? where name=?";
qr.update(conn, sql,money ,out);
}
public void in(Connection conn, String in, double money) throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "update shiwu set money=money+? where name=?";
qr.update(conn, sql,money ,in);
}
}
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
Insert title here
4.修改ul下面的li的值
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
- 我是弱鸡
5.使用原生ajax来访问
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
//服务器响应的数据
public class AnswerServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("hello guoyebing...");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
6.使用原生ajax来访问 并且生成随机数放在后面随机数
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
public class AnswerServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write(Math.random()+" ");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
7.使用原生ajax来访问 分别用get和post方式来传数据
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
public class AnswerServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name=request.getParameter("name");
response.getWriter().write(name);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
8.将json格式里面的java对象描述 为json格式的并取值
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
9.使用get和post方式返回字符串
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
public class AnswerServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String name=request.getParameter("name");
response.getWriter().write(name);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
10.使用get和post方式返回对象
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
public class AnswerServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//java代码只能返回一个json格式的字符串{"name":"李四","age":18}转译得到下面的
response.getWriter().write("{\"name\":\"李四\",\"age\":18}");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
11.使用ajax方式访问服务器返回json对象的字符串
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
public class AnswerServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//java代码只能返回一个json格式的字符串{"name":"李四","age":18}转译
response.getWriter().write("{\"name\":\"李四\",\"age\":18}");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
12.异步校验用户名是否存在(部分代码)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
public class AnswerServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username=request.getParameter("username");
UserService service=new UserService();
boolean isExist=false;
try {
isExist=service.checkUsername(username);
} catch (SQLException e) {
e.printStackTrace();
}
response.getWriter().write("{\"isExist\":"+isExist+"}");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
public class UserService {
public boolean checkUsername(String username) throws SQLException {
UserDao dao=new UserDao();
Long isExist = dao.checkUsername(username);
return isExist>0?true:false;
}
}
public class UserDao {
public Long checkUsername(String username) throws SQLException {
QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "select count(*) from user where username=?";
Long query = (Long) runner.query(sql, new ScalarHandler(), username);
return query;
}
}
12.2 站内搜索
//前端代码 只是部分代码,里面的height不要固定,到时候随着内容的变化而自动变化