一、框架入门介绍
    1.1 jquery框架的概念
    轻量级的前端框架,jquery框架实际上本身就是js函数库,在框架中封装了很多的js完成特定的功能,程序员调用指定的方法即可完成功能的编写。jquery不会封装css属性,但是提供了修改css的方法,在jquery框架中讲解的选择器都是js的选择器。

    1.2 jquery框架的入口函数
    入口函数:浏览器一旦打开该html文件就执行的js函数
    jquery入口函数方式1
    jQuery(document).ready(function(){
    console.log(“jquery入口函数”);
    })
    jquery入口函数方式2
    $(document).ready(function(){
    console.log(“jqeury入口函数2”);
    })
    jquery入口函数3
    jQuery(function(){
    console.log(“入口函数3”);
    })
    jquery入口函数4,推荐使用
    $(function(){
    console.log(“入口函数4”);
    })

    原生js入口函数和jquery入口函数的区别
    1、原生js的入口函数,后面的函数会将前面入口函数效果覆盖,而jquery入口函数有多少执行多少,相互之间没有影响。

    2、原生js入口函数,会等到前端的所有标签及内容加载完毕才会执行,而jquery入口函数,只要标签加载完毕就执行。

    二、jquery的选择器
    jquery选择器:选择到指定的标签,一般是对标签进行css样式设置、对标签进行属性增删改查、对标签的值或者两个标签之间的文本内容操作以及对html标签的增删改查。
    2.1 基本选择器
    1、id选择器
    $(“#list-2”).css(“border”,”2px red solid”);
    2、class选择器
    $(“.items”).css(“background-color”,”red”);
    3、标签选择器
    $(“li”).css(“border”,”2px yellow solid”);
    4、全局选择器,将所有的标签都选择上,包括body标签
    $(“*”).css(“border”,”2px aqua solid”);
    5、多个选择器,只要写在里面的选择器所在的标签,都将被选择上
    $(“#list-2,.items”).css(“background-color”,”red”);
    2.2 层级选择器
    1、组合选择器,前面的选择器用于筛选范围,后面的才是css的作用标签
    $(“#two .items”).css(“border”,”2px red solid”);
    2、选择出一个父标签中的直接子标签,其他后辈标签不被选择
    $(“#one > li”).css(“border”,”2px red solid”);
    3、选择出指定标签紧邻的下一个兄弟标签,只会选择到一个
    $(“#list-4 + li”).css(“border”,”2px aqua solid”);
    4、选择出指定标签下面所有的兄弟标签
    $(“#list-2 ~ li”).css(“border”,”2px red solid”);

    2.3 基本筛选器
    1、从符合选择器标签中找出第一个标签
    $(“#two li:first”).css(“border”,”2px red solid”);
    2、从符合要求选择器标签中找出最后一个标签
    $(“#two .items:last”).css(“border”,”2px red solid”);
    3、从符合要求选择器里面找出指定下标的标签
    $(“#two li:eq(2)”).css(“border”,”2px black solid”);
    4、从符合要求选择器里面找出大于指定下标的标签
    $(“#two li:gt(2)”).css(“border”,”2px red solid”);
    5、从符合要求选择器里面找出小于指定下标的标签
    $(“#two li:lt(2)”).css(“border”,”2px red solid”);
    6、从符合要求选择器里面找出偶数的下标标签
    $(“#two li:even”).css(“background-color”,”red”);
    7、从符合要求选择器里面找出奇数的下标标签
    $(“#two li:odd”).css(“background-color”,”red”);
    8、找出符合要要求选择器里面找出没有使用指定选择器名称的标签
    $(“#two li:not(‘#two-c’)”).css(“background-color”,”red”);

    2.4 内容选择器
    1、判断标签之间是否包含指定文本内容,只要符合了选择器,就会被选择,不管是本身内容包含指定文本还是
    子标签中存在指定文本都将被选择
    $(“li:contains(‘1’)”).css(“border”,”2px red solid”);
    2、从符合选择器的标签中,再筛选出没有内容或者没有子标签的标签。
    $(“li:empty”).css(“border”,”2px red solid”);
    3、conf符合选择器标签中,再去找该标签的子标签,看子标签中是否使用了has里面指定的选择器,如果
    使用了,则把符合要求的父标签选择上
    $(“ul:has(‘.items’)”).css(“border”,”2px red solid”);
    4、从符合选择器标签中,找出是否有父标签的标签
    $(“ul:parent”).css(“border”,”2px red solid”);

    2.5 可见性选择器
    1、找出隐藏的标签
    $(“div:hidden”).css(“border-radius”,”50%”).css(“display”,”block”);
    2、//找出在页面显示的标签
    $(“div:visible”).css(“background-color”,”yellow”);

    2.6 属性选择器
    1、选择出中含有指定属性的标签
    $(“img[title]”).css(“border”,”2px red solid”);
    2、选择出含有指定属性的标签并且该属性具有指定值
    $(“img[title=’这是一只羊驼’]”).css(“border”,”3px red solid”);
    3、选择出不包含指定标签,或者包含指定标签但是不等于指定值的标签。
    $(“img[title!=’这是一只羊驼’]”).css(“border”,”3px red solid”);
    4、选择出属性值是否以指定字符串开头
    $(“img[title ^= ‘这’]”).css(“border”,”red solid 3px”);
    5、选择出属性值是否以指定字符串结尾
    $(“img[title $= ‘驼’]”).css(“border”,”red solid 3px”);
    6、选择出属性值是否包含指定字符串
    $(“img[title *= ‘羊’]”).css(“border”,”red solid 3px”);
    7、多个属性一起使用,多个[属性=值]
    $(“img[title][alt]”).css(“border”,”3px red solid”);

    2.7 子元素选择器
    1、从满足要求的标签中,再判断有没有作为该父标签的第一个子标签,如果符合则被选择
    $(“.items:first-child”).css(“border”,”2px red solid”);
    2、从满足要求的标签中,看该标签是否作为给父标签下的最后一个标签
    $(“li:last-child”).css(“border”,”2px red solid”);
    3、从满足要求的标签中,再找出该标签中是否有作为该父标签下的第几个标签,从1开始计算
    $(“.items:nth-child(2)”).css(“border”,”2px red solid”);
    4、从满足要求中,找出满足该选择器的标签是否是给父标签的唯一子标签
    $(“li:only-child”).css(“border”,”2px red solid”);

    2.8 表单选择器
    1、将具有input特性或者表现形式的都选择上
    $(“:input”).css(“border”,”2px red solid”).css(“width”,”50px”);
    2、将type值为text的input标签选择出来
    $(“:text”).css(“border”,”2px red solid”);
    3、将type值为password的input标签选择出来
    $(“:password”).css(“border”,”2px red solid”);
    4、将type值为radio的input标签选择出来
    $(“:radio”).css(“width”,”100px”);
    5、将type值为checkbox的input标签选择出来
    $(“:checkbox”).css(“width”,”100px”);
    6、将input标签中type的值为submit的标签和button标签两个选择出来
    $(“:submit”).css(“border”,”2px red solid”);
    7、将input标签中type的值为reset的标签
    $(“:reset”).css(“border”,”2px red solid”);
    8、将input标签中type的值为button的标签,或者直接是button标签
    $(“:button”).css(“border”,”2px red solid”);
    9、将input标签中type的值为file的标签
    $(“:file”).css(“border”,”2px red solid”);

    2.9 表单对象选择器
    1、选择出不能使用的表单标签
    $(“:disabled”).css(“border”,”2px red solid”);
    2、选择出可以使用的表单选择器
    $(“:enabled”).css(“border”,”blue 2px solid”);
    3、找出复选框中被选择了的选择器
    $(“:checked”).css(“width”,”100px”);
    4、找出下拉框中被选择的标签
    $(“:selected”).css(“background-color”,”gray”);

    三、jquery的事件
    1、鼠标单击事件
    $(“#btn”).click(function(){

    })
    2、鼠标双击事件
    $(“#btn”).dblclick(function(){

    })
    3、鼠标按下事件
    $(“#btn”).mousedown(function(){

    })
    4、鼠标松开事件
    $(“#btn”).mouseup(function(){

    })
    5、鼠标移动到上面触发,移动到标签上面之后,只执行一次
    $(“img”).mouseover(function(){

    })
    6、鼠标移除
    $(“img”).mouseout(function(){

    })
    7、鼠标穿过
    $(“img”).mouseenter(function(){

    })

    8、鼠标移除
    $(“img”).mouseleave(function(){

    })
    9、鼠标移动
    $(“img”).mousemove(function(){

    })
    10、键盘按下事件
    $(window).keydown(function(event){
    console.log(event.keyCode);
    })
    11、键盘松开事件
    $(window).keyup(function(event){
    console.log(event.keyCode);
    })
    12、失去焦点事件
    $(“input”).blur(function(){

    })
    13、获取焦点事件
    $(“input”).focus(function(){

    })
    14、改变事件
    $(“input”).change(function(){

    })
    四、jquery的属性
    4.1 jquery的属性操作
    1、attr()函数有三个作用
    1、如果attr(“属性名”);只获取该属性的值
    2、如果attr(“属性名”,”属性值”),判断该标签中是否已经有该属性名,如果有,则表示将该属性的值修改
    3、如果attr(“属性名”,”属性值”),判断该标签中是否已经有该属性名,如果没有,则表示将该属性新增上,并赋值
    2、removeAttr(“属性名”),将指定的属性名移除
    4.2 class类的操作
    主要的作用是为了操作css里面的class选择器,要想使用class类操作之前,必须先在style标签里面定义好class选择器
    1、给指定标签增加一个class选择器,给class选择器已经被定义了
    $(“#list-2”).addClass(“current”);
    2、判断指定标签,是否存在指定class选择器
    var flag = $(“#list-2”).hasClass(“current”);
    3、将指定标签中的指定class选择器移除
    $(“#list-2”).removeClass(“current”);
    4、toggleClass();自带判断是否有该class属性,如果有则将其取消,如果没有,则添加上。
    $(this).toggleClass(“current”);

    4.3 文本、html和value值操作
    1、向一个标签中新增标签
    $(“#one”).html(“”)
    2、操作两个标签之间的文本信息,包括:新增,修改、删除和获取值
    $(“#one”).text(“”);
    3、val(),只能操作具有value属性或者具有value特性的标签,如果val()没有值,则表示获取,val(有值)表示设置标签中的value值
    var val = $(“#userName”).val(“张三”);

    五、筛选
    1、从符合要求的标签中找出指定的标签
    $(“#two li”).eq(2).css(“border”,”2px red solid”);
    2、从符合要求的标签中找出第一个标签
    $(“#two li”).first().css(“border”,”2px blue solid”);
    3、从符合要求的标签中找出最后一个标签
    $(“#two li”).last().css(“border”,”2px blue solid”);
    4、从符合要求的标签中,找出使用了指定class选择器的标签,该方法返回的是boolean,不能在跟方法
    var flag = $(“#two-c”).hasClass(“items”);
    5、判断父标签中是否有符合要求的子标签,如果有则把父标签选择上
    $(“li”).has(“ul”).css(“border”,”2px red solid”);
    6、从结果集中找出没有使用指定选择器的标签
    $(“#two li”).not($(“#two .items”)[0]).css(“border”,”2px red solid”);
    7、从集合中根据下标选定范围内的标签
    $(“#two li”).slice(1,3).css(“border”,”2px yellow solid”);

    8、从父标签中找到符合要求选择器的直接子标签
    $(“#two”).children().eq(0).css(“border”,”2px red solid”);
    9、从父标签中找到符合要求选择器的后代标签
    $(“#one”).find(“.items”).css(“border”,”2px red solid”);
    10、找出指定标签的下一个紧邻兄弟标签,可以使用选择器进行再次判断
    $(“#two-c”).next(“.items”).css(“border”,”2px red solid”);
    11、找出指定标签下面的所有兄弟标签,并且可以使用选择器再次筛选
    $(“#two-c”).nextAll(“.items”).css(“border”,”2px red solid”);
    12、prev找出指定标签的上一个紧邻兄弟标签,可以使用选择器进行再次判断
    $(“#two-c”).prev(“.items”).css(“border”,”2px red solid”);
    13、找出指定标签上面的所有兄弟标签,并且可以使用选择器再次筛选
    $(“#two-c”).prevAll(“”).css(“border”,”2px red solid”);
    14、选择出所有的兄弟标签
    $(“#two-c”).siblings().css(“background-color”,”red”);
    15、parent,找到指定原元素的父标签
    $(“#li-42”).parent().css(“border”,”2px red solid”);

    六、文档操作
    6.1内部插入
    在一个父标签中,添加上子标签,只能有两个选择,第一个子标签或者最后一个子标签
    1、append();在一个父标签中,在尾部添加一个新的标签
    $(“#out”).append(“”);
    2、appendTo()方法,和上面的作用一致,先创建新的标签,再添加到指定的父标签中
    $(“”).appendTo($(“#out”));
    3、prepend方法,在一个父标签中的第一个位置添加子标签
    $(“#out”).prepend(“”);
    4、prependTo()方法,和上面的方法作用一致,先创建标签,再添加到指定的父标签中
    $(“”).prependTo($(“#out”));

    6.2外部插入
    1、after,在指定的标签之后新增一个标签
    $(“#out img”).eq(1).after(“”);
    2、before,在指定的标签之前新增一个标签,占用之前的位置
    $(“#out img”).eq(1).before(“”);
    3、insertAfter,先创建标签,在找到在哪个标签之后新增
    $(“”).insertAfter($(“#out img”)[1]);
    4、insertBefore()
    $(“”).insertBefore($(“#out img”)[1]);

    6.3 包裹
    1、wrap,先获取指定标签,并给改标签创建一个父标签
    $(“#out img”).eq(1).wrap(“

    6.4 删除
    1、empty();将一个父标签下的所有子标签置为null,相当于删除
    $(“#out”).empty();
    2、remove(),将符合要求的标签删除
    $(“#out img”).eq(1).remove();

    七、ajax和json
    7.1 原生ajax中get请求
    function request(){
    //1、创建请求的对象
    var ajax = new XMLHttpRequest();

    //2、设置请求路径和值
    ajax.open(“get”,”/AjaxDemo/demo1?userName=”+$(“#userName”).val()+”&password=”+);

    //3、发送请求
    ajax.send();

    //4、回调
    ajax.onreadystatechange = function(data){
    console.log(data)
    }
    }
    7.2 原生ajax中post请求
    function request(){
    //1、创建对象
    var ajax = new XMLHttpRequest();

    //2、设置发送的路径
    ajax.open(“post”,”/AjaxDemo/demo1”);

    //多一步;设置请求头
    ajax.setRequestHeader(“content-type”,”application/x-www-form-urlencoded”);

    //3、发送
    ajax.send(“userName=root&password=admin”);

    //4、回调
    ajax.onreadystatechange = function(data){
    console.log(data);
    }
    }
    7.3 jquery的ajax
    jquery完成ajax请求
    前后端结合(ajax+json)
    @WebServlet(“/ajax”)
    public class AjaxServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request, response);
    }

    1. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    // String userName = request.getParameter(“userName”);
    // String password = request.getParameter(“password”);
    // System.out.println(“用户名:”+userName+”,密码:”+password);
    // System.out.println(“请求成功”);

    1. User user = new User();
    2. user.setUserName("123123");
    3. user.setPassword("abcd");
    4. user.setAge(19);
    5. user.setSex("man");
    6. User u2 = new User();
    7. u2.setUserName("qqqq");
    8. u2.setPassword("aaaa");
    9. u2.setAge(20);
    10. u2.setSex("0");
    11. User u3 = new User();
    12. u3.setUserName("wwww");
    13. u3.setPassword("bbbb");
    14. u3.setAge(22);
    15. u3.setSex("00");
    16. List<User> list = new ArrayList<>();
    17. list.add(user);
    18. list.add(u2);
    19. list.add(u3);
    20. //将对象转换成json字符串格式
    21. String json = JSON.toJSONString(list);
    22. response.getWriter().write(json);
    23. }
    24. }

    八、静态模板技术
    8.1 入门示例代码
    编写一个java基础的类,实现模板技术的文件替换
    /*

    • @ClassName: Demo1
    • @Description:静态模板的入门程序
    • @author Alon
    • @date 2020年12月18日 上午10:17:01

    */
    public class Demo1 {
    public static void main(String[] args) throws IOException {
    //1、创建静态模板的对象,可以将其理解为引擎
    TemplateEngine en = new TemplateEngine();

    1. //2、创建模板对象的文件,将一个前端页面作为模板
    2. FileTemplateResolver resolver = new FileTemplateResolver();
    3. //处理编码集
    4. resolver.setCharacterEncoding("UTF-8");
    5. //设置模板所在的前缀
    6. resolver.setPrefix("page/");
    7. //设置模板的后缀
    8. resolver.setSuffix(".html");
    9. //3、将模板对象添加到静态模板引擎中
    10. en.addTemplateResolver(resolver);
    11. //模板的目的,是将模板中需要替换的内容,将其替换成动态数据
    12. Context context = new Context();
    13. //将数据设置进去
    14. context.setVariable("userName", "李四");
    15. //由引擎生成文件
    16. en.process("a", context, new FileWriter("page/a.html"));
    17. }

    }

    8.2 web端使用静态模板
    @WebServlet(“/index”)
    public class IndexServlet extends HttpServlet {

    1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    2. doPost(request, response);
    3. }
    4. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    5. //实现模板技术
    6. //1、创建模板引擎对象
    7. TemplateEngine en = new TemplateEngine();
    8. //2、创建模板对象的文件,需要将request获取的ServletContext作为参数传递到构造函数中
    9. ServletContextTemplateResolver resolver =
    10. new ServletContextTemplateResolver(request.getServletContext());
    11. //添加到引擎里面
    12. en.addTemplateResolver(resolver);
    13. //3、设置编码集
    14. resolver.setCharacterEncoding("utf-8");
    15. response.setCharacterEncoding("UTF-8");
    16. response.setContentType("UTF-8");
    17. request.setCharacterEncoding("UTF-8");
    18. //4、设置前缀和后缀
    19. resolver.setPrefix("page/");
    20. //设置后缀
    21. resolver.setSuffix(".html");
    22. request.setAttribute("userName", "张三");
    23. //5、存数据的对象
    24. WebContext context = new WebContext(request, response, request.getServletContext());
    25. //6、完成模板
    26. en.process("a",context,response.getWriter());
    27. }

    }

    九、邮件激活
    /*

    • @ClassName: MailUtils
    • @Description:发送邮件的工具包
    • @author Alon
    • @date 2020年12月18日 下午3:35:48

    /
    public class MailUtils {
    /**

    @Title: sendMail
    @Description: 发送邮件的工具方法
    @param @param email
    @param @param code
    @return void
    @throws
    */
    public static void sendMail(String email,String code,int id) {
    //将邮箱的参数设置好
    Properties prop = new Properties();
    prop.put(“mail.transport”, “smtp”);
    prop.put(“mail.smtp.port”, “25”);
    prop.put(“mail.smtp.auth”, “true”);
    prop.put(“mail.smtp.host”, “smtp.163.com”);

    1. //获取会话
    2. Session session = Session.getInstance(prop, new Authenticator() {
    3. //设置发送的邮箱及密码(该密码不是登录密码,是授权码)
    4. @Override
    5. protected PasswordAuthentication getPasswordAuthentication() {
    6. // TODO Auto-generated method stub
    7. return new PasswordAuthentication("private_lxl@163.com","XGZQGQWSALHDJADB");
    8. }
    9. });
    10. //获取邮件对象,发送邮箱,接受邮箱,邮件的主题,邮件的内容
    11. Message message = new MimeMessage(session);
    12. try {
    13. //设置发送邮箱
    14. message.setFrom(new InternetAddress("private_lxl@163.com"));
    15. //设置收件邮箱
    16. message.setRecipient(Message.RecipientType.TO, new InternetAddress(email));
    17. //设置主题:
    18. message.setSubject("来自于蜗牛的温暖激活码");
    19. //设置文件的内容
    20. message.setContent("请点击超链接进行激活<a href='http://58h9y5.natappfree.cc/WebDemo7/start'?id="+id+"&code="+code+"></a>","text/html;charset=utf-8");
    21. //发送邮件
    22. Transport.send(message);
    23. } catch (Exception e) {
    24. e.printStackTrace();
    25. }
    26. }

    }

    十、代理设计模式
    概念:在代理设计模式里面,分为两个部分:目标对象和代理对象,调用的时候,用户不会直接调用目标对象,而是通过代理对象调用目标对象的实现。
    10.1静态代理
    public interface UserDao {

    1. public void eat();

    }
    public class UserDaoImpl implements UserDao{

    1. @Override
    2. public void eat() {
    3. System.out.println("用户吃");
    4. }

    }
    public class Mapper implements UserDao{
    private UserDaoImpl userDaoImpl;
    public Mapper(UserDaoImpl userDaoImpl) {
    this.userDaoImpl = userDaoImpl;
    }
    @Override
    public void eat() {
    userDaoImpl.eat();
    }

    }
    public class App {
    public static void main(String[] args) {文件的上传下载
    文件上传
    前端代码

    1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    2. doPost(request, response);
    3. }
    4. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    5. try {
    6. //编码集
    7. request.setCharacterEncoding("UTF-8");
    8. response.setCharacterEncoding("UTF-8");
    9. response.setHeader("Content-type", "textml;charset=utf-8");
    10. //获取参数
    11. String prodName = request.getParameter("prodName");
    12. String price = request.getParameter("price");
    13. String description = request.getParameter("description");
    14. //处理前端传递过来的流
    15. Part part = request.getPart("img");
    16. InputStream in = part.getInputStream();
    17. //获取真实的绝对路径
    18. String proPath = this.getServletContext().getRealPath("/");
    19. //替换斜杠
    20. proPath = proPath.replace("\\","/");
    21. //去掉最后一个斜杠
    22. proPath = proPath.substring(0,proPath.length()-1);
    23. //去掉项目名
    24. proPath = proPath.substring(0, proPath.lastIndexOf("/"));
    25. //拼接文件夹名
    26. String folder = proPath+"/image";
    27. //判断该文件夹是否存在
    28. File file = new File(folder);
    29. if(!file.exists()) {
    30. file.mkdirs();
    31. }
    32. //获取文件的后缀
    33. String temp = part.getHeader("content-disposition");
    34. String suffix = temp.substring(temp.indexOf("."),temp.length()-1);
    35. String uuid = UUID.randomUUID().toString();
    36. String fileName = folder+"/"+uuid+suffix;
    37. //创建文件输出对象
    38. FileOutputStream fos = new FileOutputStream(new File(fileName));
    39. //定义数组
    40. byte[] buf = new byte[1024];
    41. int len = 0;
    42. while((len = in.read(buf)) != -1) {
    43. fos.write(buf, 0, len);
    44. }
    45. //关闭资源
    46. fos.close();
    47. System.out.println("有图片过来了......");
    48. }catch(Exception e) {
    49. e.printStackTrace();
    50. }
    51. }

    }
    文件下载
    前端代码

    1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    2. doPost(request, response);
    3. }
    4. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    5. try {
    6. //获取项目中的文件。
    7. String fileName = this.getServletContext().getRealPath("/image/cat.jpg");
    8. response.setHeader("content-disposition", "attachment;filename=cat.jpg");
    9. //创建输入流对象
    10. InputStream in = new FileInputStream(new File(fileName));
    11. //获取输出流
    12. OutputStream out = response.getOutputStream();
    13. //复制文件的过程
    14. byte[] buf = new byte[1024];
    15. int len = 0;
    16. while((len = in.read(buf)) != -1) {
    17. out.write(buf, 0, len);
    18. }
    19. //关闭资源
    20. in.close();
    21. }catch(Exception e) {
    22. e.printStackTrace();
    23. }
    24. }

    //创建目标对象
    UserDaoImpl userDaoImpl = new UserDaoImpl();

    1. //创建代理对象
    2. Mapper mapper = new Mapper(userDaoImpl);
    3. mapper.eat();
    4. }

    }