轻量级http服务器,它比Tomcat小,所以叫 Jerry。
<dependencies>
<dependency>
<groupId>com.jay</groupId>
<artifactId>jerry</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
在resources目录下创建server.properties,并添加以下配置。
# 服务器端口
server.port=8080
Handler类似Tomcat的Servlet和SpringMVC的Controller,它负责处理请求。
创建一个Handler很简单:
@Handler("/hello")
@Slf4j
public class HelloHandler extends DefaultHttpHandler {
@Override
public void handleGet(HttpRequest httpRequest, HttpResponse httpResponse) {
// 获取参数
Map<String, String> params = httpRequest.getParams();
String name = params.get("name");
log.info("hello: {}", name);
// 使用out写入数据
httpResponse.out().write("hello: " + name);
}
@Override
public void handlePost(HttpRequest httpRequest, HttpResponse httpResponse) {
// 处理POST
httpResponse.out().write("hello");
}
}
想要让Jerry管理静态资源,比如html页面、图片?使用StaticResourceHandler可以轻松实现静态资源访问。
@Handler("/image")
public class ImageHandler extends StaticResourceHandler {
@Override
public String getStaticResource(HttpRequest httpRequest) {
return "timg.gif";
}
}
通过JerryApplication.run方法开启Jerry服务器,不用担心tomcat那样的servlet配置文件,Jerry会自动扫描标有@Handler注解的处理器,并保存在自己的IOC容器中。
不要忘了使用@IOCScan声明要扫描的包。
@IOCScan(basePackage = "com.jay.test.handler")
public class TestApplication {
public static void main(String[] args) {
JerryApplication.run(TestApplication.class, args);
}
}
Jerry会自动解析form-data的表单数据,并将属性存储在请求的参数列表中。
用户可以通过request.getParameter(name)获取表单数据。
@Override
public void handlePost(HttpRequest request, HttpResponse response) {
String username = request.getParameter("username");
String password = request.getParameter("password");
// do something...
}
Jerry支持使用multipart-form-data方式的文件上传。
用户 可以通过 request.getFiles()获取文件列表。
获取到MultipartFile对象后,你可以通过它的InputStream来读取字节数据。
@Override
public void handlePost(HttpRequest request, HttpResponse response) {
List<MultipartFile> files = request.getFiles();
for(MultipartFile file : files){
// 获取文件名
log.info("filename: {}", file.getFilename());
// 获取form-data-name
log.info("name: {}", file.getName());
// read from inputStream
InputStream inputStream = file.getInputStream();
}
}
Jerry支持Cookie,你只需要用request.getCookie和response.setCookie就能够轻松的使用。
@Override
public void handleGet(HttpRequest httpRequest, HttpResponse httpResponse) {
// request cookie
Cookie cookie = httpRequest.getCookie("my-cookie");
log.info("myCookie is {}", cookie.getValue());
// response cookie
Cookie respCookie = Cookie.builder().name("response-cookie").value("jerry's cookie").build();
httpResponse.setCookie(respCookie);
}
Jerry提供了Session功能,用户只需要使用request.getSession()就能获取一个会话对象。
目前Jerry的Session是基于Cookie的,所以暂时只支持开启Cookie的请求。
下面是一个简单的登录功能实例,可以帮你理解Jerry的Session:
@Handler("/login")
public class LoginHandler extends DefaultHttpHandler {
@Override
public void handleGet(HttpRequest httpRequest, HttpResponse httpResponse) {
}
@Override
public void handlePost(HttpRequest request, HttpResponse response) {
// 从form-data获取用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
// 封装用户对象
User user = new User();
user.setAge(100);
user.setUsername(username);
user.setPassword(password);
// 省略:检查用户名密码
// 获取session
HttpSession session = request.getSession();
// 将用户对象存入session
session.put("login_user", user);
response.out().write("login success");
}
}
想要过滤一些请求,Jerry的用户自定义过滤器可以很好地实现这个功能。
下面是一个用户登录验证的过滤器示例:
@Filter
@Slf4j
public class LoginFilter extends AbstractFilter {
public LoginFilter() {
/*
三个参数分别是,过滤器名称,优先级,排除路径规则
优先级数值大的过滤器优先执行。
排除路径请使用正则表达式声明。
*/
super("login-filter", 1000, new String[]{"/login"});
}
@Override
public boolean doFilter(HttpRequest httpRequest) {
HttpSession session = httpRequest.getSession();
return session.get("login_user") != null;
}
}
你可以通过@IOC注解来声明一个被Jerry管理的单例对象,并通过@Value注解对属性赋值。
@IOC
public class User {
// Jerry 会从配置文件读取属性值
@Value("user.name")
private String name;
@Value("user.age")
private int age;
private String email;
// 通过@Construct告诉Jerry你想使用的构造方法
@Construct
public User(@Value("user.email") String email){
this.email = email;
}
// 没有想用的构造方法?Jerry会默认使用空参构造方法,不过记得使用@Value给参数赋值
public User(){
}
}
目前Jerry还处于开发阶段,所以没有实际应用的性能测试报告。不过在开发过程中,开发者有使用Jmeter对Jerry进行简单的压力测试。
一个最简单的handler,它接收到请求后直接回复一个hello字符串给客户端。
@Handler("/hello")
@Slf4j
public class HelloHandler extends DefaultHttpHandler {
@Override
public void handleGet(HttpRequest httpRequest, HttpResponse httpResponse) {
httpResponse.out().write("hello");
}
@Override
public void handlePost(HttpRequest httpRequest, HttpResponse httpResponse) {
httpResponse.out().write("hello");
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。