JavaWeb_day6_事务&ajax&Listener&filter

Js和jQuery分别实现分类商品和是否热门

JavaWeb_day6_事务&ajax&Listener&filter_第1张图片

 

同步和异步

同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发第二个请求

异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求

 

JS原生的Ajax技术

  1. 创建Ajax引擎对象
  2. 为Ajax引擎对象绑定监听
  3. 绑定提交地址
  4. 发送请求
  5. 接受响应数据

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的两种格式:

  1. 对象格式:{"key1":obj,"key2":obj,"key3":obj...};
  2. 数组/集合格式:[{},{}..];

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])

JavaWeb_day6_事务&ajax&Listener&filter_第2张图片

$.ajax( { option1:value1,option2:value2... } );

常用的option有如下:

async:是否异步,默认是true代表异步

data:发送到服务器的参数,建议使用json格式

dataType:服务器端返回的数据类型,常用text和json

success:成功响应执行的函数,对应的类型是function类型

type:请求方式,POST/GET

url:请求服务器端地址

JavaWeb_day6_事务&ajax&Listener&filter_第3张图片

//使用json的转换工具将对象或集合转成json格式的字符串

  1. Jsonlib   sun公司自己的
  2. Gson  google
  3. Fastjson 阿里巴巴
  4. jackson

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);
	
	}

}

JavaWeb_day6_事务&ajax&Listener&filter_第4张图片

 

JavaWeb_day6_事务&ajax&Listener&filter_第5张图片JavaWeb_day6_事务&ajax&Listener&filter_第6张图片

JavaWeb_day6_事务&ajax&Listener&filter_第7张图片JavaWeb_day6_事务&ajax&Listener&filter_第8张图片

 

JavaWeb_day6_事务&ajax&Listener&filter_第9张图片JavaWeb_day6_事务&ajax&Listener&filter_第10张图片

 

JavaWeb_day6_事务&ajax&Listener&filter_第11张图片

JavaWeb_day6_事务&ajax&Listener&filter_第12张图片

监听器Listener

8大监听器(6+2)

3大域的监听器       ServletRequest  HttpSession  ServletContex

与session有关的监听器(对象感知监听器)

session中的对象有4种状态

绑定状态:将对象被放到session域中

解绑状态:将对象从session域中移除了

钝化状态:是将session内存中的对象持久化(序列化)到磁盘

活化状态:就是将磁盘上的对象再次恢复到session内存中

绑定与解绑的监听器HttpSessionBindingListener,不需要再web.xml里面配置

钝化与活化的监听器HttpSessionActivationListener   要记得实现serializable

 

2)监听器的编写步骤(重点):

  1. 编写一个监听器类去实现监听器接口
  2. 覆盖监听器的方法
  3. 需要在web.xml中进行配置---注册

 

  <listener>

    <listener-class>listener-class>

  listener>

 

ServletContexListener监听器的作用:

初始化资源:加载数据库和spring的配置文件

任务调度:定时器  Timer/TimerTask

 

前六个监听器需要配置,但是对象感知监听器不需要配置

 

下面这个看看就行了,通过配置文件的方式

JavaWeb_day6_事务&ajax&Listener&filter_第13张图片

 

 

 

 

 

1分钟访问就会被钝化,然后再次访问就会被激活了   (在原有钝化基础上起作用)

 

邮箱服务器

邮件发送的协议:

协议:就是数据传输的约束

发送邮件的协议:SMTP             接受邮件的协议:POP3  

 

过滤器filter

写一个类实现filter接口

实现方法(着重实现doFilter方法)

在web.xml里面配置(主要对哪些资源拦截)

JavaWeb_day6_事务&ajax&Listener&filter_第14张图片

放行 chain.doFilter(request, response);

注解:在类上添加    /*  拦截所有

@WebFilter("/*") //访问所有的资源之前,多会执行该过滤器

获取任何位置

类.class.getClassLoader().getResource(“”).getPath()

过滤器:一般用于完成通用的操作,如:登录验证,统一编码处理,敏感字符过滤

JavaWeb_day6_事务&ajax&Listener&filter_第15张图片

JavaWeb_day6_事务&ajax&Listener&filter_第16张图片

JavaWeb_day6_事务&ajax&Listener&filter_第17张图片

JavaWeb_day6_事务&ajax&Listener&filter_第18张图片

JavaWeb_day6_事务&ajax&Listener&filter_第19张图片

可以增强参数 返回值 方法体的逻辑

代理对象

JavaWeb_day6_事务&ajax&Listener&filter_第20张图片JavaWeb_day6_事务&ajax&Listener&filter_第21张图片

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();
    }
}

 

JavaWeb_day6_事务&ajax&Listener&filter_第22张图片

结果:如果调用的show方法,不会被增强,原样输出

如果调用的sale方法,

 

JavaWeb_day6_事务&ajax&Listener&filter_第23张图片

结果:

辅助理解

JavaWeb_day6_事务&ajax&Listener&filter_第24张图片

打印的结果

JavaWeb_day6_事务&ajax&Listener&filter_第25张图片JavaWeb_day6_事务&ajax&Listener&filter_第26张图片

在src下面放一个文件,里面放敏感词汇

JavaWeb_day6_事务&ajax&Listener&filter_第27张图片

/**
 * 敏感词汇过滤器
 */
@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来访问  

JavaWeb_day6_事务&ajax&Listener&filter_第28张图片

6.使用原生ajax来访问      并且生成随机数放在后面随机数

7.使用原生ajax来访问      分别用get和post方式来传数据   

8.将json格式里面的java对象描述 为json格式的并取值

9.使用get和post方式返回字符串   

JavaWeb_day6_事务&ajax&Listener&filter_第29张图片

10.使用get和post方式返回对象

JavaWeb_day6_事务&ajax&Listener&filter_第30张图片

11.使用ajax方式访问服务器返回json对象的字符串 

JavaWeb_day6_事务&ajax&Listener&filter_第31张图片

12.异步校验用户名是否存在

12.2:站内搜索(鼠标抬起的时候,会自动去数据库查询)

JavaWeb_day6_事务&ajax&Listener&filter_第32张图片

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不要固定,到时候随着内容的变化而自动变化