Skip to content

Commit

Permalink
[Update] 更新netty的使用
Browse files Browse the repository at this point in the history
  • Loading branch information
counten committed Jan 13, 2020
1 parent c533738 commit 508a9c1
Show file tree
Hide file tree
Showing 71 changed files with 3,641 additions and 343 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
.sts4-cache

### IntelliJ IDEA ###
.idea
.idea/
*.iws
*.iml
*.ipr
Expand Down
4 changes: 3 additions & 1 deletion .idea/compiler.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 1 addition & 2 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

146 changes: 106 additions & 40 deletions .idea/workspace.xml

Large diffs are not rendered by default.

7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,13 @@

项目中涉及的框架相关知识并不多,主要涉及了许多 Java 基础的知识,如:Java 程序编译和运行的过程、Java 类加载机制、Java 类文件结构、Java 反射等。除此之外,还涉及到了一个简单的并发问题:如何将一个非线程安全的类变为一个线程安全的类。因此,本项目较为适合在比较注重基础的面试中介绍给面试官,可以引出一些 Java 虚拟机,Java 并发相关的问题,较能体现应聘者对于 Java 的一些原理性的知识的掌握程度。在本篇文章中,我们尽可能的将用到的知识简单讲解一下或者给出讲解的链接,以方便大家阅读。


## TODO
1. 基于注解实现类似spring的controller的注解;
1. 类似SpringBoot的Application启动接口。
1. 系统运行日志
1. 完善页面

#### 运行效果

![项目展示](./doc/pic/项目展示_update_20190430.gif)
Expand Down
23 changes: 22 additions & 1 deletion WebIDE.iml
Original file line number Diff line number Diff line change
@@ -1,2 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4" />
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: io.netty:netty-all:4.1.44.Final" level="project" />
<orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.62" level="project" />
<orderEntry type="library" name="Maven: org.ow2.asm:asm:6.1" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
</component>
</module>
44 changes: 44 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,23 @@
<groupId>cn.codeyourlife</groupId>
<artifactId>WebIDE</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<encoding>UTF-8</encoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>io.netty</groupId>
Expand All @@ -18,6 +35,33 @@
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>6.1</version>
</dependency>

<!-- log-->

<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>

<!-- test-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>

</dependencies>

</project>
40 changes: 40 additions & 0 deletions src/main/java/cn/codeyourlife/JDEApplication.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package cn.codeyourlife;

import cn.codeyourlife.controller.ExceptionController;
import cn.codeyourlife.interceptor.CorsInterceptor;
import cn.codeyourlife.server.WebServer;

/**
* Author: [email protected]
* Copyright: http://codeyourlife.cn
* Platform: Win10 Jdk8
* Date: 2020/1/13
*/
public class JDEApplication {
public static void main(String[] args) {
// 忽略指定url
WebServer.getIgnoreUrls().add("/favicon.ico");

// 全局异常处理
WebServer.setExceptionHandler(new ExceptionController());

// 设置监听端口号
WebServer server = new WebServer(2006);

// 设置Http最大内容长度(默认 为10M)
server.setMaxContentLength(1024 * 1024 * 50);

// 设置Controller所在包
server.setControllerBasePackage("cn.codeyourlife.controller");

// 添加拦截器,按照添加的顺序执行。
// 跨域拦截器
server.addInterceptor(new CorsInterceptor(), "/不用拦截的url");

try {
server.start();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
61 changes: 0 additions & 61 deletions src/main/java/cn/codeyourlife/WebIdeApplication.java

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -112,4 +112,4 @@ public byte[] getCompiledBytes() {
return outputStream.toByteArray();
}
}
}
}
30 changes: 30 additions & 0 deletions src/main/java/cn/codeyourlife/controller/ExceptionController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package cn.codeyourlife.controller;

import cn.codeyourlife.server.HttpContextHolder;
import cn.codeyourlife.server.HttpResponse;
import cn.codeyourlife.server.HttpStatus;
import cn.codeyourlife.server.controller.ExceptionHandler;
import cn.codeyourlife.server.exception.ResourceNotFoundException;

public class ExceptionController implements ExceptionHandler {

/**
* 处理异常
* @param e
*/
@Override
public void doHandle(Exception e) {
HttpStatus status = HttpStatus.INTERNAL_SERVER_ERROR;
if(e instanceof ResourceNotFoundException) {
status = HttpStatus.NOT_FOUND;
}
String errorMessage = e.getCause() == null ? "" : e.getCause().getMessage();
if(errorMessage == null) {
errorMessage = e.getMessage();
}
HttpResponse response = HttpContextHolder.getResponse();
response.write(status, errorMessage);
response.closeChannel();
}

}
14 changes: 14 additions & 0 deletions src/main/java/cn/codeyourlife/controller/RunCodeController.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,32 @@
package cn.codeyourlife.controller;

import cn.codeyourlife.server.ResponseEntity;
import cn.codeyourlife.server.annotation.GetMapping;
import cn.codeyourlife.server.annotation.JsonResponse;
import cn.codeyourlife.server.annotation.RequestMapping;
import cn.codeyourlife.server.annotation.RestController;

/**
* Author: [email protected]
* Copyright: http://codeyourlife.cn
* Platform: Win10 Jdk8
* Date: 2020/1/8
*/

@RestController
@RequestMapping("/ide")
public class RunCodeController {
private static final String defaultSource = "public class Run {\n"
+ " public static void main(String[] args) {\n"
+ " \n"
+ " }\n"
+ "}";

@GetMapping("")
public ResponseEntity<?> hello() {
return ResponseEntity.ok().build("hello world");
}

// public String entry(Model model) {
// model.addAttribute("lastSource", defaultSource);
// return "ide";
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/cn/codeyourlife/execute/ByteUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,4 @@ public static byte[] byteReplace(byte[] oldBytes, int offset, int len, byte[] re
oldBytes.length - offset - len);
return newBytes;
}
}
}
30 changes: 30 additions & 0 deletions src/main/java/cn/codeyourlife/interceptor/CorsInterceptor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package cn.codeyourlife.interceptor;

import cn.codeyourlife.server.HttpResponse;
import cn.codeyourlife.server.interceptor.Interceptor;
import io.netty.handler.codec.http.FullHttpRequest;

/**
* 跨域拦截器
* @author Leo
*/
public final class CorsInterceptor implements Interceptor {

@Override
public boolean preHandle(FullHttpRequest request, HttpResponse response) throws Exception {
response.getHeaders().put("Access-Control-Allow-Origin", "*");
response.getHeaders().put("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
response.getHeaders().put("Access-Control-Max-Age", "3600");
response.getHeaders().put("Access-Control-Allow-Headers", "Content-Type, X-Token");
return true;
}

@Override
public void postHandle(FullHttpRequest request, HttpResponse response) throws Exception {
}

@Override
public void afterCompletion(FullHttpRequest request, HttpResponse response) {
}

}
Loading

0 comments on commit 508a9c1

Please sign in to comment.