本周概要:
本周的学习进入了更深入的阶段。Java Web开始接触核心的状态保持和动态页面技术,Hadoop开始钻研其核心编程模型,Python也开始进行数据处理。感觉知识体系正在逐渐连点成线。

总学习时长: 约 35 小时
投入代码时间: 约 20 小时
解决问题时间: 约 9 小时
理论学习时间: 约 6 小时
本周详细内容:

  1. 本周做了什么?
    Java Web 方面 (约 18 小时):
    学习内容: 重点学习了Session和Cookie的工作原理、区别及应用场景。理解了为什么HTTP是无状态的,以及如何用这两种技术来有状态地管理用户会话。
    代码实践: 在上周的学生管理系统基础上,增加了用户登录功能。
    创建了用户表user和登录页面login.html。
    编写了LoginServlet:验证用户密码成功后,将用户对象存入Session:request.getSession().setAttribute("user", userObj)。
    编写了LogoutServlet:用于注销,session.invalidate()。
    在ListStudentServlet中增加了判断:如果Session中没有用户信息,则重定向到登录页面。这样就实现了简单的权限控制。
    初步接触JSP: 学习了JSP的基本语法,如脚本片段<% %>、表达式<%= %>和声明<%! %>,并尝试将listStudent.html改写成listStudent.jsp,使用JSP表达式来动态渲染学生列表。
    Hadoop 方面 (约 12 小时):
    学习内容: 深入学习了MapReduce编程模型,理解了Mapper、Reducer、Driver三个核心组件的作用和数据流(Input -> Map -> Shuffle & Sort -> Reduce -> Output)。
    代码实践: 在IDEA中搭建了Hadoop开发环境,添加了所有依赖Jar包。然后没有满足于运行官方的WordCount,而是自己手写了一遍WordCount程序的每一个类,并打包成JAR包,上传到Hadoop集群运行成功。这个过程让我对MapReduce的代码结构有了深刻理解。
    Python 方面 (约 5 小时):
    学习内容: 学习了pandas库的核心数据结构Series和DataFrame。
    实践: 将上周爬取的新闻数据保存为CSV文件,然后使用pandas读取,并尝试了一些基本操作,如:查看数据概览df.describe()、选择特定列df['title']、过滤数据df[df['click' > 100]]等。
  2. 遇到的问题与解决方案
    问题一: 在IDEA中编写MapReduce程序时,运行时一直报错No FileSystem for scheme: file。
    解决过程: 这是一个经典的依赖冲突问题。Hadoop常见的winutils.exe问题也与此相关。
    解决方案: 在项目的pom.xml(Maven)中,为hadoop-common依赖添加了provided。或者在IDEA的运行配置中,手动添加了Hadoop的依赖路径。核心是确保运行时使用的Hadoop Jar包版本与集群一致,且没有冲突。
    问题二: 在JSP页面中,使用<% %>脚本片段和HTML混编,代码看起来非常混乱,难以维护。
    解决过程: 意识到这是一种bad practice(陋习),查阅资料后知道了有JSTL和EL表达式这种更好的方式。
    解决方案: 这只是发现了问题,我决定将学习JSTL和EL作为下周的重点计划,来解决这个代码可读性问题。
    下周计划:
    Java Web: 学习并使用JSTL标签库和EL表达式来彻底取代JSP中的Java脚本片段,让页面更清晰。学习过滤器和监听器。
    Hadoop: 尝试编写一个自定义的MapReduce程序,比如统计每个手机号的总通话时长。
    Python: 继续深入学习pandas,学习分组、聚合、合并等更高级的操作。