Jfinal 第一天 idea中新建项目

1.新建一个maven工程。

 


一直下一步即可,最后finish.

2.pom.xml配置

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>cn.superv</groupId>
  <artifactId>jfinal</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>jfinal Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.jfinal/jfinal -->
    <dependency>
      <groupId>com.jfinal</groupId>
      <artifactId>jfinal</artifactId>
      <version>3.2</version>
    </dependency>
  </dependencies>
    <!-- jetty配置 -->
    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <groupId>org.mortbay.jetty</groupId>
          <artifactId>jetty-maven-plugin</artifactId>
          <version>8.1.16.v20140903</version>
          <configuration>
            <connectors>
              <connector implementation="org.eclipse.jetty.server.bio.SocketConnector">
                <port>8082</port>
              </connector>
            </connectors>
            <stopKey />
            <stopPort />
          </configuration>
        </plugin>
      </plugins>

  </build>
</project>

3.web.xml配置
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>

  <filter>
    <filter-name>jfinal</filter-name>
    <filter-class>com.jfinal.core.JFinalFilter</filter-class>
      <init-param>
          <param-name>configClass</param-name>
          <param-value>cn.superv.SysConfig</param-value>
      </init-param>
  </filter>
    <filter-mapping>
        <filter-name>jfinal</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>


4.系统加载时的类SysConfig类。
package cn.superv;

import com.jfinal.config.*;
import com.jfinal.template.Engine;

/**
 * Created by Administrator on 2017/8/10 0010.
 */
public class SysConfig extends JFinalConfig{

    @Override
    public void configConstant(Constants constants) {
        System.out.println("configConstant"+1);

    }

    @Override
    public void configRoute(Routes routes) {
        System.out.println("configRoute"+2);
    }

    @Override
    public void configEngine(Engine engine) {
        System.out.println("configEngine"+3);
    }

    @Override
    public void configPlugin(Plugins plugins) {
        System.out.println("configPlugin"+4);
    }

    @Override
    public void configInterceptor(Interceptors interceptors) {
        System.out.println("configInterceptor"+5);
    }

    @Override
    public void configHandler(Handlers handlers) {
        System.out.println("configHandler"+6);
    }
}
打印结果:






# 题目重述 根据用户访问网站的日志数据,完成以下两个统计任务: (1) 统计2020年5月至2021年2月期间,**每日的总访问次数**,并按日期输出结果。 (2) 将第(1)步的结果按**访问次数升序排序**。 使用的开发环境为基于 Hadoop 的 **IDEA(IntelliJ IDEA)软件**,意味着我们将使用 Java 编写 MapReduce 程序来处理大规模日志数据。 --- # 详解 亲爱的奶奶,我们现在不是用笔和纸来数人数了,而是让一台“超级电脑”(Hadoop集群)帮我们干活。你在IDEA里写的程序会告诉这台电脑:“请帮我数一数每一天来了多少人,并从小到大排好队。” 下面我一步一步教您怎么做: --- ## ✅ 第一步:准备工作 —— 创建项目 1. 打开 **IntelliJ IDEA** 2. 新建一个 Maven 项目: - `File → New → Project → Maven` 3. 添加 Hadoop 相关依赖(在 `pom.xml` 文件中加入) ```xml <dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>3.3.1</version> </dependency> </dependencies> ``` 👉 解释:这就像是给您的工具箱装上“扳手、锤子”这些干活的工具(Hadoop 的代码库)。 --- ## ✅ 第二步:编写 Mapper 类 Mapper 的任务是:读取每一行日志,提取出“日期”,然后标记为“1次访问”。 ```java import java.io.IOException; import org.apache.hadoop.io.*; import org.apache.hadoop.mapreduce.Mapper; public class VisitCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text date = new Text(); public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // 获取一行数据 String line = value.toString(); // 忽略标题行(如果是第一行) if (line.startsWith("Id")) return; // 按逗号分割字段(假设是CSV格式) String[] fields = line.split(","); // 第5个字段是 Date time(索引为4) String datetimeStr = fields[4]; // 提取“日期”部分,例如 "2020-05-01 14:23:55" → "2020-05-01" String dateStr = datetimeStr.trim().substring(0, 10); // 设置输出键(日期),值为1 date.set(dateStr); context.write(date, one); // 输出:<"2020-05-01", 1> } } ``` 👉 解释:这个“Mapper”就像一个小工人,它一页一页翻您的访客登记簿,看到一个人来,就写下:“今天是2020-05-01,来了1个人”。 --- ## ✅ 第三步:编写 Reducer 类 Reducer 的任务是:把同一个日期的所有“1”加起来,得到当天总访问次数。 ```java import java.io.IOException; import org.apache.hadoop.io.*; import org.apache.hadoop.mapreduce.Reducer; public class VisitCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); // 把所有的1累加 } result.set(sum); context.write(key, result); // 输出:<"2020-05-01", 1500> } } ``` 👉 解释:这个“Reducer”像是组长,他收集所有小工人的记录,发现有1500个写着“2020-05-01”的纸条,于是总结:“这一天总共来了1500人”。 --- ## ✅ 第四步:编写 Driver 主程序 这是启动整个任务的“指挥官”。 ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.*; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class DailyVisitCount { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "Daily Visit Count"); job.setJarByClass(DailyVisitCount.class); job.setMapperClass(VisitCountMapper.class); job.setCombinerClass(VisitCountReducer.class); // 局部合并优化 job.setReducerClass(VisitCountReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); // 输入路径 FileOutputFormat.setOutputPath(job, new Path(args[1])); // 输出路径 System.exit(job.waitForCompletion(true) ? 0 : 1); } } ``` 👉 解释:这个主程序就像发号施令的队长:“所有人注意!开始执行‘每日访问统计’任务!输入文件在这里,输出放那里!” --- ## ✅ 第五步:打包并提交到 Hadoop 运行 1. 在 IDEA 中点击 `Build → Build Project` 或使用 Maven 打包: ```bash mvn package ``` 得到一个 `.jar` 文件,比如:`daily-visit-count-1.0.jar` 2. 把日志文件上传到 HDFS: ```bash hdfs dfs -put /local/path/access.log /input/ ``` 3. 运行 MapReduce 任务: ```bash hadoop jar daily-visit-count-1.0.jar DailyVisitCount /input/access.log /output ``` ⚠️ 注意:每次运行前确保 `/output` 目录不存在,否则报错。 --- ## ✅ 第六步:对结果进行升序排序(二次排序) 目前输出是按**日期排序**的,但我们需要按**访问次数升序排序**。这需要额外一步:**二次排序(Secondary Sort)或使用另一个MapReduce阶段排序**。 ### 方法:再写一个排序程序(简化版) 只需让 Reducer 输出 `<访问次数, 日期>`,就能自动按次数排序。 修改 Reducer 输出顺序: ```java // 修改 Reducer 输出:以“访问次数”作为键 context.write(new IntWritable(sum), key); // 输出:<1500, "2020-05-01"> ``` 同时修改主程序: ```java job.setOutputKeyClass(IntWritable.class); // 键变为访问次数 job.setOutputValueClass(Text.class); // 值变为日期 ``` 这样 Hadoop 自动按“访问次数”从小到大排序! --- ## ✅ 最终输出示例 运行完成后,查看输出文件: ```text 1230 2020-09-15 1250 2020-08-03 1300 2020-07-22 ... ``` 👉 表示访问最少的是1230次,对应日期是2020年9月15日,依此类推。 --- # 知识点(列出解答该问题需要的知识点) 1. **MapReduce 编程模型** 分为 Map 和 Reduce 阶段,用于分布式处理海量数据。 2. **Hadoop 数据类型与序列化** 使用 `Text`, `IntWritable` 等特定类型保证网络传输效率。 3. **自定义排序机制** 通过调整 Key 类型(如用访问次数作 Key),实现结果自动排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值