内容介绍
Java高手真经:Java Web核心框架(应用框架卷)
作者:刘中兵Java研究室 编著
【图书简介】
本书首先分析了Java Web应用的分层设计方法,并进行应用框架的选型,然后讲解各种Java Web应用框架、集成技术、实战开发。主要内容包括如下。持久层框架Hibernate:讲解Hibernate入门与核心技术,分别实现MySQL、Oracle、SQL Server数据库的信息系统开发。持久层框架iBATIS:讲解iBATIS入门与核心技术,分别实现MySQL、Oracle、SQLServer数据库的信息系统开发。表现层框架Struts l:讲解Struts l 的入门配置、核心组件、标签库、国际化、数据校验、Sitemesh集成、数据库开发技术,并分别实现与Hibernate、iBATIS持久层框架的集成开发。表现层框架Struts 2:讲解Struts 2的入门配置、核心组件、标签库、国际化、数据校验、转换器、拦截器,并分别实现与Hibernate、iBATIS持久层框架的集成开发。业务层框架Sprin9:讲解Sprin9的入门配置与IoC容器,并讲解使用Sprin9进行MVC应用开发的标签库、国际化、数据校验、数据库开发技术。多层框架集成:实现5种框架的搭配集成,分别实现SSH l、SSI 1、SSH 2、SSI 2集成框架的开发。随书附赠光盘内容为本书各种原型包、系统源程序。本书内容循序渐进,通俗易懂,覆盖了Java Web开发的最流行框架技术。无论对于Java软件设计还是软件开发,本书都是精通开发Java Web应用的必备的实用手册。本书适合作为Java相关培训机构的教材,也可作为Java自学人员的参考手册。
【本书目录】
- 绪论Java Web分层设计与框架选型
- 第1部分准备篇
- 第1课构建Eclipse集成开发环境
- 第2课创建企业信息管理系统数据库
- 第2部分持久层框架Hibernate
- 第3课Hibernate快速入门
- 第4课Hibernate核心技术详解
- 第5课Hibernate项目实践——企业信息管理系统MySQL数据库开发
- 第6课Hibernate项目实战——企业信息管理系统Oracle数据库开发
- 第7课Hibernate项目实战——企业信息管理系统SQL Server数据库开发
- 第3部分持久层框架iBATLS
- 第8课iBATLS快速入门
- 第9课iBATLS核心技术详解
- 第10课iBATLS代码生成工具iBATLS
- 第11课iBATLS项目实战——企业信息管理系统MySQL数据库开发
- 第12课iBATLS项目实践——企业信息管理系统Oracle数据库开发
- 第13课iBATLS项目实践——企业信息管理系统SQL Server数据库开发
- 第4部分表现层框架Struts 1+Hibernate/BATIS
- 第14课Struts快速入门
- 第15课Struts核心组件详解
- 第16课Struts标签库详解
- 第17课Struts应用国际化
- 第18课Struts数据校险
- 第19课Struts与SiteMesh集成
- 第20课Struts访问数据库
- 第21课Struts项目实战——企业信息管理系统Struts 1+Hibernate实现
- 第22课Struts项目实践——企业信息管理系统Struts+iBATIS实现
- 第5部分表现层框架Struts2+Hibernate/iBATIS
- 第23课Struts 2快速入门
- 第24课Struts 2核心组件详解
- 第25课Struts 2标签库详解
- 第26课Struts 2应用国际化
- 第27课Struts 2数据校验
- 第28课Struts 2数据转换器
- 第29课Struts 2拦截器
- 第30课Struts 2项目实战——企业信息
- 第31课Struts 2项目实战——企业信息管理系统Struts 2+iBATIS实现
- 第6部分Spring快速入门
- 第32课 Spring快速入门
- 第33课Spring用做IoC容器
- 第34课Spring用作MVC框架
- 第35课Spring标签库
- 第36课Spring应用国际化
- 第37课Spring数据校验
读书笔记
Java/Web调用Hadoop进行MapReduce示例代码
Hadoop环境搭建详见此文章//www.jb51.net/article/33649.htm。
我们已经知道Hadoop能够通过Hadoop jar ***.jar input output的形式通过命令行来调用,那么如何将其封装成一个服务,让Java/Web来调用它?使得用户可以用方便的方式上传文件到Hadoop并进行处理,获得结果。首先,***.jar是一个Hadoop任务类的封装,我们可以在没有jar的情况下运行该类的main方法,将必要的参数传递给它。input 和output则将用户上传的文件使用Hadoop的JavaAPI put到Hadoop的文件系统中。然后再通过Hadoop的JavaAPI 从文件系统中取得结果文件。
搭建JavaWeb工程。本文使用Spring、SpringMVC、MyBatis框架, 当然,这不是重点,就算没有使用任何框架也能实现。
项目框架如下:
项目中使用到的jar包如下:
在Spring的配置文件中,加入
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8" />
<property name="maxUploadSize" value="10485760000" />
<property name="maxInMemorySize" value="40960" />
</bean>
使得项目支持文件上传。
新建一个login.jsp 点击登录后进入user/login
user/login中处理登录,登录成功后,【在Hadoop文件系统中创建用户文件夹】,然后跳转到console.jsp
package com.chenjie.controller;
import java.io.IOException;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.chenjie.pojo.JsonResult;
import com.chenjie.pojo.User;
import com.chenjie.service.UserService;
import com.chenjie.util.AppConfig;
import com.google.gson.Gson;
/**
* 用户请求控制器
*
* @author Chen
*
*/
@Controller
// 声明当前类为控制器
@RequestMapping("/user")
// 声明当前类的路径
public class UserController {
@Resource(name = "userService")
private UserService userService;// 由Spring容器注入一个UserService实例
/**
* 登录
*
* @param user
* 用户
* @param request
* @param response
* @throws IOException
*/
@RequestMapping("/login")
// 声明当前方法的路径
public String login(User user, HttpServletRequest request,
HttpServletResponse response) throws IOException {
response.setContentType("application/json");// 设置响应内容格式为json
User result = userService.login(user);// 调用UserService的登录方法
request.getSession().setAttribute("user", result);
if (result != null) {
createHadoopFSFolder(result);
return "console";
}
return "login";
}
public void createHadoopFSFolder(User user) throws IOException {
Configuration conf = new Configuration();
conf.addResource(new Path("/opt/hadoop-1.2.1/conf/core-site.xml"));
conf.addResource(new Path("/opt/hadoop-1.2.1/conf/hdfs-site.xml"));
FileSystem fileSystem = FileSystem.get(conf);
System.out.println(fileSystem.getUri());
Path file = new Path("/user/" + user.getU_username());
if (fileSystem.exists(file)) {
System.out.println("haddop hdfs user foler exists.");
fileSystem.delete(file, true);
System.out.println("haddop hdfs user foler delete success.");
}
fileSystem.mkdirs(file);
System.out.println("haddop hdfs user foler creat success.");
}
}
console.jsp中进行文件上传和任务提交、
文件上传和任务提交:
package com.chenjie.controller;
import java.io.File;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.URI;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.JobID;
import org.apache.hadoop.mapred.JobStatus;
import org.apache.hadoop.mapred.RunningJob;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import com.chenjie.pojo.User;
import com.chenjie.util.Utils;
@Controller
// 声明当前类为控制器
@RequestMapping("/hadoop")
// 声明当前类的路径
public class HadoopController {
@RequestMapping("/upload")
// 声明当前方法的路径
//文件上传
public String upload(HttpServletRequest request,
HttpServletResponse response) throws IOException {
List<String> fileList = (List<String>) request.getSession()
.getAttribute("fileList");//得到用户已上传文件列表
if (fileList == null)
fileList = new ArrayList<String>();//如果文件列表为空,则新建
User user = (User) request.getSession().getAttribute("user");
if (user == null)
return "login";//如果用户未登录,则跳转登录页面
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
request.getSession().getServletContext());//得到在Spring配置文件中注入的文件上传组件
if (multipartResolver.isMultipart(request)) {//如果请求是文件请求
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
Iterator<String> iter = multiRequest.getFileNames();//得到文件名迭代器
while (iter.hasNext()) {
MultipartFile file = multiRequest.getFile((String) iter.next());
if (file != null) {
String fileName = file.getOriginalFilename();
File folder = new File("/home/chenjie/CJHadoopOnline/"
+ user.getU_username());
if (!folder.exists()) {
folder.mkdir();//如果文件不目录存在,则在服务器本地创建
}
String path = "/home/chenjie/CJHadoopOnline/"
+ user.getU_username() + "/" + fileName;
File localFile = new File(path);
file.transferTo(localFile);//将上传文件拷贝到服务器本地目录
// fileList.add(path);
}
handleUploadFiles(user, fileList);//处理上传文件
}
}
request.getSession().setAttribute("fileList", fileList);//将上传文件列表保存在Session中
return "console";//返回console.jsp继续上传文件
}
@RequestMapping("/wordcount")
//调用Hadoop进行mapreduce
public void wordcount(HttpServletRequest request,
HttpServletResponse response) {
System.out.println("进入controller wordcount ");
User user = (User) request.getSession().getAttribute("user");
System.out.println(user);
// if(user == null)
// return "login";
WordCount c = new WordCount();//新建单词统计任务
String username = user.getU_username();
String input = "hdfs://chenjie-virtual-machine:9000/user/" + username
+ "/wordcountinput";//指定Hadoop文件系统的输入文件夹
String output = "hdfs://chenjie-virtual-machine:9000/user/" + username
+ "/wordcountoutput";//指定Hadoop文件系统的输出文件夹
String reslt = output + "/part-r-00000";//默认输出文件
try {
Thread.sleep(3*1000);
c.main(new String[] { input, output });//调用单词统计任务
Configuration conf = new Configuration();//新建Hadoop配置
conf.addResource(new Path("/opt/hadoop-1.2.1/conf/core-site.xml"));//添加Hadoop配置,找到Hadoop部署信息
conf.addResource(new Path("/opt/hadoop-1.2.1/conf/hdfs-site.xml"));//Hadoop配置,找到文件系统
FileSystem fileSystem = FileSystem.get(conf);//得打文件系统
Path file = new Path(reslt);//找到输出结果文件
FSDataInputStream inStream = fileSystem.open(file);//打开
URI uri = file.toUri();//得到输出文件路径
System.out.println(uri);
String data = null;
while ((data = inStream.readLine()) != null) {
//System.out.println(data);
response.getOutputStream().println(data);//讲结果文件写回用户网页
}
// InputStream in = fileSystem.open(file);
// OutputStream out = new FileOutputStream("result.txt");
// IOUtils.copyBytes(in, out, 4096, true);
inStream.close();
} catch (Exception e) {
System.err.println(e.getMessage());
}
}
@RequestMapping("/MapReduceStates")
//得到MapReduce的状态
public void mapreduce(HttpServletRequest request,
HttpServletResponse response) {
float[] progress=new float[2];
try {
Configuration conf1=new Configuration();
conf1.set("mapred.job.tracker", Utils.JOBTRACKER);
JobStatus jobStatus = Utils.getJobStatus(conf1);
// while(!jobStatus.isJobComplete()){
// progress = Utils.getMapReduceProgess(jobStatus);
// response.getOutputStream().println("map:" + progress[0] + "reduce:" + progress[1]);
// Thread.sleep(1000);
// }
JobConf jc = new JobConf(conf1);
JobClient jobClient = new JobClient(jc);
JobStatus[] jobsStatus = jobClient.getAllJobs();
//这样就得到了一个JobStatus数组,随便取出一个元素取名叫jobStatus
jobStatus = jobsStatus[0];
JobID jobID = jobStatus.getJobID(); //通过JobStatus获取JobID
RunningJob runningJob = jobClient.getJob(jobID); //通过JobID得到RunningJob对象
runningJob.getJobState();//可以获取作业状态,状态有五种,为JobStatus.Failed 、JobStatus.KILLED、JobStatus.PREP、JobStatus.RUNNING、JobStatus.SUCCEEDED
jobStatus.getUsername();//可以获取运行作业的用户名。
runningJob.getJobName();//可以获取作业名。
jobStatus.getStartTime();//可以获取作业的开始时间,为UTC毫秒数。
float map = runningJob.mapProgress();//可以获取Map阶段完成的比例,0~1,
System.out.println("map=" + map);
float reduce = runningJob.reduceProgress();//可以获取Reduce阶段完成的比例。
System.out.println("reduce="+reduce);
runningJob.getFailureInfo();//可以获取失败信息。
runningJob.getCounters();//可以获取作业相关的计数器,计数器的内容和作业监控页面上看到的计数器的值一样。
} catch (IOException e) {
progress[0] = 0;
progress[1] = 0;
}
request.getSession().setAttribute("map", progress[0]);
request.getSession().setAttribute("reduce", progress[1]);
}
//处理文件上传
public void handleUploadFiles(User user, List<String> fileList) {
File folder = new File("/home/chenjie/CJHadoopOnline/"
+ user.getU_username());
if (!folder.exists())
return;
if (folder.isDirectory()) {
File[] files = folder.listFiles();
for (File file : files) {
System.out.println(file.getName());
try {
putFileToHadoopFSFolder(user, file, fileList);//将单个文件上传到Hadoop文件系统
} catch (IOException e) {
System.err.println(e.getMessage());
}
}
}
}
//将单个文件上传到Hadoop文件系统
private void putFileToHadoopFSFolder(User user, File file,
List<String> fileList) throws IOException {
Configuration conf = new Configuration();
conf.addResource(new Path("/opt/hadoop-1.2.1/conf/core-site.xml"));
conf.addResource(new Path("/opt/hadoop-1.2.1/conf/hdfs-site.xml"));
FileSystem fileSystem = FileSystem.get(conf);
System.out.println(fileSystem.getUri());
Path localFile = new Path(file.getAbsolutePath());
Path foler = new Path("/user/" + user.getU_username()
+ "/wordcountinput");
if (!fileSystem.exists(foler)) {
fileSystem.mkdirs(foler);
}
Path hadoopFile = new Path("/user/" + user.getU_username()
+ "/wordcountinput/" + file.getName());
// if (fileSystem.exists(hadoopFile)) {
// System.out.println("File exists.");
// } else {
// fileSystem.mkdirs(hadoopFile);
// }
fileSystem.copyFromLocalFile(true, true, localFile, hadoopFile);
fileList.add(hadoopFile.toUri().toString());
}
}
启动Hadoop:
运行结果:
可以在任意平台下,登录该项目地址,上传文件,得到结果。
运行成功。
源代码:https://github.com/tudoupaisimalingshu/CJHadoopOnline
总结
篇幅有限!篇幅有限!关于《Java高手真经应用框架卷》这本书,就聊到这儿啦…啦…啦…
以上小编所介绍的全部相关的笔记资料都已整理成册,不论是Redis面试+Redis实战pdf,还是MongDB快速上手+MongDB集群安全等手写pdf笔记,想白嫖都很so easy!!
——如果你get到了,那就点个赞转发支持一波吧!
——整理不易,白嫖私信,100%回复分享!
——也可以加小助手VX:xcw18874131605
——祝前程似锦,offer不断,好好学习,天天向上!