1. ジュレベルとは何ですか?
1.1 はじめに
JRebel は Java 開発ツールであり、リアルタイム コード リロード用のプラグインです。その主な機能は、アプリケーションを再起動せずに、変更した Java コードを実行中のアプリケーションにリアルタイムで適用することにより、開発サイクルを短縮し、開発効率を向上させることです。
ライブ コード リロード: JRebel は、開発者による Java コードへの変更を監視し、アプリケーションを再起動することなく、これらの変更を実行中のアプリケーションにリアルタイムで適用できます。こうすることで、開発者はコード変更の影響をすぐに確認できるため、再コンパイルやデプロイにかかる時間を節約できます。
複数のフレームワークとサーバーをサポート: JRebel は、Spring、Hibernate、Java EE、Tomcat、Jetty など、複数の Java フレームワークとサーバーをサポートします。Web アプリケーションを開発しているか、エンタープライズ レベルのアプリケーションを開発しているかに関係なく、JRebel を一般的に使用される開発フレームワークおよびサーバーと統合して、リアルタイムのコード リロードを提供できます。
高い互換性: JRebel は、ほとんどの Java 開発ツールおよび統合開発環境 (IDE) (Eclipse、IntelliJ IDEA、NetBeans など) と互換性があります。開発者は、別のツールに切り替えることなく、お気に入りの IDE で JRebel プラグインを使用できます。
高速なデプロイメント: JRebel は、アプリケーション全体を再起動せずに、変更したコードを実行中のアプリケーションに適用するだけでよいため、アプリケーションのデプロイメントを高速化できます。これは、大規模なアプリケーションや複雑な展開環境に特に役立ちます。
複数の開発シナリオをサポート: JRebel は、ローカル開発、リモート開発、クラウド開発など、さまざまな開発シナリオに適用できます。スタンドアロン開発でも分散開発でも、JRebel はリアルタイムのコード リロードを提供できます。
全体として、JRebel は強力な Java 開発ツールであり、開発者はリアルタイム コード リロード機能により、アプリケーションを再起動することなく、変更を Java コードに迅速に適用できます。これにより、開発効率が大幅に向上し、開発サイクルが短縮され、開発者はコードの作成とデバッグにさらに集中できるようになります。
1.2jrebelのダウンロード方法
IDEA を開き、[ファイル]、[設定]、[プラグイン] の順に選択し、検索ボックスに「jrebel」と入力します。
1.3 jrebel サービスをダウンロードして有効にする
まずサービスをダウンロードし、GitHub Web サイトにアクセスします。リリース v1.4 · ilanyu/ReverseProxy · GitHub
386.exe または adm64.exe を選択してダウンロードします
ダウンロード後、ファイルをダブルクリックします
開始後、アイデアを開いてアクティブ化できますが、サービスを開いていない場合は、次のエラーが表示されます。
1.4 オンラインでの GUID の生成
オンラインで GUID URL を生成: GUID online erstellen
失敗した場合は、GUID を更新して置き換えてください。
1.5 JRebelのアクティベーション
サーバーアドレス: https://127.0.0.1:8888/
{GUID}
このインターフェイスの表示は成功を示します
成功したら、JRebel を通じてプロジェクトを開始できます。この方法で Java コードを変更すると、サーバーを再起動するという時間のかかる操作が不要になります。
1.6 関連設定
1. オフライン作業モードに設定します
オフライン モードに設定した後、ReverseProxy_windows_amd64 サービスを開始する必要はありません。このインターフェイスは、オフライン モードを表し、調整しているように見えます。
2. 自動コンパイルを設定する
ホット デプロイメントを実装するには、まず Intellij を次のように設定する必要があります。
JRebel はホット デプロイメントを実現するためにクラス ファイルの変更をリアルタイムで監視するため、いつでも変更を加えて有効にするには、アイデア環境で自動ミューテーション機能をオンにする必要があります。
注意事項 ❗Jrebel
でプロジェクトを開始する前に Jrebel サービスを開く必要があります。そうしないとエラーが発生します。プロジェクトを正しく開始した後はサービスを閉じないでください。まずサーバー (tomcat) をオフにしてから、Jrebel サービスをオフにしてください。オフライン モードを使用する必要がある場合、最初に jrebel サービスをオフにすることはできません。セットアップして Tomcat をオフにし、最後に Jrebel サービスをオフにすると、Jrebel サービスをオンにする必要がなくなり、プロジェクトを直接開始できます。ジュレベルを通じて。
2. ファイルのアップロードとダウンロード
2..1 pom 依存関係をインポートする
<commons-fileupload.version>1.3.3</commons-fileupload.version>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload.version}</version>
</dependency>
2.2 設定ファイルアップロードパーサー
spring-mvc.xml ファイルにファイル アップロード パーサーを追加します。
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 必须和用户JSP 的pageEncoding属性一致,以便正确解析表单的内容 -->
<property name="defaultEncoding" value="UTF-8"></property>
<!-- 文件最大大小(字节) 1024*1024*50=50M-->
<property name="maxUploadSize" value="52428800"></property>
<!--resolveLazily属性启用是为了推迟文件解析,以便捕获文件大小异常-->
<property name="resolveLazily" value="true"/>
</bean>
このコードは、ファイルのアップロードを処理するために「multipartResolver」という名前の Bean を構成します。「defaultEncoding」属性、「maxUploadSize」属性、「resolveLazily」属性を設定することで、ファイルアップロード時の文字エンコーディング、最大アップロードサイズ、遅延ファイル解析動作を指定できます。このようにして、Spring フレームワークは、ファイルのアップロードを処理するときに、これらの構成に基づいて、対応する解析と制限を実行します。
2.3 ファイルアップロードフォームの設定
単純なファイル アップロード フォーム ページを定義し、enctype 属性を設定してフォーム データのエンコード タイプを「multipart/form-data」として指定します。これは、ファイル アップロードをサポートするために使用されるエンコード タイプです。次に、バックグラウンドで受け入れられるように、アップロードされたファイルの名前を「imgFile」に設定し、最後に指定された URL にファイルをアップロードします。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<base href="${pageContext.request.contextPath }">
<title>文件上传</title>
</head>
<body>
<form action="/file/upload" method="post" enctype="multipart/form-data">
<label>编号:</label><input type="text" name="id" readonly="readonly" value="${param.id}"/><br/>
<label>图片:</label><input type="file" name="imgFile"/><br/>
<input type="submit" value="上传图片"/>
</form>
</body>
</html>
テーブル情報を構成してコードを生成する
ジェネレーターConfig.xml :
<table schema="" tableName="img_upload" domainObjectName="UploadImg"
enableCountByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" enableUpdateByExample="false">
</table>
ステップ 3:ビジネス ロジック レイヤーを作成し、インターフェイスを実装します...
ステップ 4:構成ファイルのパス情報
resource.properties:
#本地路径
dir=D:/upload/
#服务器路径
server=/upload/
書き込み設定ファイル読み込みツールクラス
package com.xzs.utils;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class PropertiesUtil {
public static String getValue(String key) throws IOException {
Properties p = new Properties();
InputStream in = PropertiesUtil.class.getResourceAsStream("/resource.properties");
p.load(in);
return p.getProperty(key);
}
}
ステップ 5:プロジェクトとマッピングアドレスを構成する
コントローラーを書く
package com.xzs.web;
import com.xzs.biz.UploadImgBiz;
import com.xzs.model.UploadImg;
import com.xzs.utils.PageBean;
import com.xzs.utils.PropertiesUtil;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.List;
@Controller
@RequestMapping("/file")
public class UploadImgController {
@Autowired
private UploadImgBiz uploadImgBiz;
/*新增方法*/
@RequestMapping("/add")
public String save(UploadImg uploadImg, HttpServletRequest request) {
uploadImgBiz.insertSelective(uploadImg);
return "redirect:list";
}
/*删除方法*/
@RequestMapping("/del/{id}")
public String del(@PathVariable("id") Integer id) {
uploadImgBiz.deleteByPrimaryKey(id);
return "redirect:/file/list";
}
/*修改方法*/
@RequestMapping("/edit")
public String edit(UploadImg uploadImg, HttpServletRequest request) {
uploadImgBiz.updateByPrimaryKeySelective(uploadImg);
return "redirect:list";
}
/*查询方法*/
@RequestMapping("/list")
public String list(UploadImg uploadImg, HttpServletRequest request) {
PageBean pageBean = new PageBean();
pageBean.setRequest(request);
List<UploadImg> uploadImgs = uploadImgBiz.listPager(uploadImg, pageBean);
// ModelAndView modelAndView = new ModelAndView();
// modelAndView.addObject("UploadImgs", UploadImgs);
// modelAndView.addObject("pageBean", pageBean);
// modelAndView.setViewName("UploadImg/list");
request.setAttribute("uploadImgs", uploadImgs);
request.setAttribute("pageBean", pageBean);
return "file/list";
}
/*数据回显*/
@RequestMapping("/preSave")
public String preSave(UploadImg uploadImg, HttpServletRequest request) {
if (uploadImg != null && uploadImg.getId() != null && uploadImg.getId() != 0) {
UploadImg img = uploadImgBiz.selectByPrimaryKey(uploadImg.getId());
request.setAttribute("img", img);
}
return "file/edit";
}
/*图片上传*/
@RequestMapping("upload")
public String upload(UploadImg img,MultipartFile imgFile) throws IOException {
//读取配置文夹本地路径和服务器路径
String dir = PropertiesUtil.getValue("dir");
String server = PropertiesUtil.getValue("server");
//利用MultipartFile类接受前端传递到后台的文件
System.out.println("文件名:"+imgFile.getOriginalFilename());
System.out.println("文件类型:"+imgFile.getContentType());
//将文件转成流写入到服务器
FileUtils.copyInputStreamToFile(imgFile.getInputStream(),new File(dir+imgFile.getOriginalFilename()));
//通过对象将图片保存到数据库
img.setImg(server+imgFile.getOriginalFilename());
uploadImgBiz.updateByPrimaryKeySelective(img);
return "redirect:list";
}
}
ステップ 7:フロントエンド JSP を作成する
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="w" uri="http://jsp.veryedu.cn" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link
href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css"
rel="stylesheet">
<script
src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js"></script>
<base href="${pageContext.request.contextPath }">
<title>博客列表</title>
<style type="text/css">
.page-item input {
padding: 0;
width: 40px;
height: 100%;
text-align: center;
margin: 0 6px;
}
.page-item input, .page-item b {
line-height: 38px;
float: left;
font-weight: 400;
}
.page-item.go-input {
margin: 0 10px;
}
</style>
</head>
<body>
<form class="form-inline"
action="/file/list" method="post">
<div class="form-group mb-2">
<input type="text" class="form-control-plaintext" name="name"
placeholder="请输入用户名称">
</div>
<button type="submit" class="btn btn-primary mb-2">查询</button>
<a class="btn btn-primary mb-2" href="/file/preSave">新增</a>
</form>
<table class="table table-striped">
<thead>
<tr>
<th scope="col">ID</th>
<th scope="col">用户</th>
<th scope="col">图片</th>
</tr>
</thead>
<tbody>
<c:forEach var="i" items="${uploadImgs }">
<tr>
<td>${i.id }</td>
<td>${i.name }</td>
<td>
<img src="${i.img }" style="width: 200px;height: 100px;">
</td>
<td>
<a href="/file/preSave?id=${i.id}">修改</a>
<a href="/file/del/${i.id}">删除</a>
<a href="/page/file/upload?id=${i.id}">图片上传</a>
<a href="/file/download?id=${i.id}">图片下载</a>
</td>
</tr>
</c:forEach>
</tbody>
</table>
<!-- 这一行代码就相当于前面分页需求前端的几十行了 -->
<w:page pageBean="${pageBean }"></w:page>
</body>
</html>
アップロードテスト
画像ダウンロード