package org.noear.solon.web.servlet;
import org.noear.solon.Utils;
import org.noear.solon.boot.web.Constants;
import org.noear.solon.boot.web.WebContextBase;
import org.noear.solon.boot.web.RedirectUtils;
import org.noear.solon.core.NvMap;
import org.noear.solon.core.handle.ContextAsyncListener;
import org.noear.solon.core.handle.UploadedFile;
import org.noear.solon.core.util.IgnoreCaseMap;
import org.noear.solon.core.util.IoUtil;
import jakarta.servlet.AsyncContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.nio.charset.Charset;
import java.util.*;
/**
* Servlet,适配为 Context
*
* @author noear
* @since 1.2
* */
public class SolonServletContext extends WebContextBase {
private HttpServletRequest _request;
private HttpServletResponse _response;
protected Map<String, List<UploadedFile>> _fileMap;
protected boolean innerIsAsync() {
return asyncContext != null;
}
public SolonServletContext(HttpServletRequest request, HttpServletResponse response) {
_request = request;
_response = response;
_fileMap = new HashMap<>();
if (sessionState().replaceable()) {
sessionState = new SolonServletSessionState(request);
}
}
private boolean _loadMultipartFormData = false;
private void loadMultipartFormData() throws IOException, ServletException {
if (_loadMultipartFormData) {
return;
} else {
_loadMultipartFormData = true;
}
//文件上传需要
if (isMultipartFormData()) {
MultipartUtil.buildParamsAndFiles(this);
}
}
@Override
public Object request() {
return _request;
}
@Override
public String remoteIp() {
return _request.getRemoteAddr();
}
@Override
public int remotePort() {
return _request.getRemotePort();
}
@Override
public String method() {
return _request.getMethod();
}
@Override
public String protocol() {
return _request.getProtocol();
}
private URI _uri;
@Override
public URI uri() {
if (_uri == null) {
_uri = URI.create(url());
}
return _uri;
}
@Override
public boolean isSecure() {
return _request.isSecure();
}
private String _url;
@Override
public String url() {
if (_url == null) {
_url = _request.getRequestURL().toString();
}
return _url;
}
@Override
public long contentLength() {
return _request.getContentLengthLong();
}
@Override
public String contentType() {
return _request.getContentType();
}
@Override
public String queryString() {
return _request.getQueryString();
}
@Override
public InputStream bodyAsStream() throws IOException {
return _request.getInputStream();
}
private NvMap _paramMap;
@Override
public NvMap paramMap() {
if (_paramMap == null) {
_paramMap = new NvMap();
try {
if (autoMultipart()) {
loadMultipartFormData();
}
Enumeration<String> names = _request.getParameterNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
String value = _request.getParameter(name);
_paramMap.put(name, value);
}
} catch (IOException | ServletException e) {
throw new IllegalStateException(e);
}
}
return _paramMap;
}
private Map<String, List<String>> _paramsMap;
@Override
public Map<String, List<String>> paramsMap() {
if (_paramsMap == null) {
_paramsMap = new LinkedHashMap<>();
try {
if (autoMultipart()) {
loadMultipartFormData();
}
_request.getParameterMap().forEach((k, v) -> {
_paramsMap.put(k, Utils.asList(v));
});
} catch (IOException | ServletException e) {
throw new IllegalStateException(e);
}
}
return _paramsMap;
}
@Override
public Map<String, List<UploadedFile>> filesMap() throws IOException {
if (isMultipartFormData()) {
try {
loadMultipartFormData();
} catch (ServletException e) {
throw new IOException(e);
}
return _fileMap;
} else {
return Collections.emptyMap();
}
}
private NvMap _cookieMap;
@Override
public NvMap cookieMap() {
if (_cookieMap == null) {
_cookieMap = new NvMap();
Cookie[] _cookies = _request.getCookies();
if (_cookies != null) {
for (Cookie c : _cookies) {
_cookieMap.put(c.getName(), c.getValue());
}
}
}
return _cookieMap;
}
@Override
public NvMap headerMap() {
if (_headerMap == null) {
_headerMap = new NvMap();
Enumeration<String> headers = _request.getHeaderNames();
while (headers.hasMoreElements()) {
String key = headers.nextElement();
String value = _request.getHeader(key);
_headerMap.put(key, value);
}
}
return _headerMap;
}
private NvMap _headerMap;
@Override
public Map<String, List<String>> headersMap() {
if (_headersMap == null) {
_headersMap = new IgnoreCaseMap<>();
Enumeration<String> headers = _request.getHeaderNames();
while (headers.hasMoreElements()) {
String key = headers.nextElement();
_headersMap.put(key, Collections.list(_request.getHeaders(key)));
}
}
return _headersMap;
}
private Map<String, List<String>> _headersMap;
//====================================
@Override
public Object response() {
return _response;
}
@Override
public void charset(String charset) {
_response.setCharacterEncoding(charset);
this.charset = Charset.forName(charset);
}
@Override
protected void contentTypeDoSet(String contentType) {
_response.setContentType(contentType);
}
@Override
public OutputStream outputStream() throws IOException {
sendHeaders();
return _response.getOutputStream();
}
@Override
public void output(byte[] bytes) {
try {
OutputStream out = outputStream();
out.write(bytes);
} catch (Throwable ex) {
throw new RuntimeException(ex);
}
}
@Override
public void output(InputStream stream) {
try {
OutputStream out = outputStream();
IoUtil.transferTo(stream, out);
} catch (Throwable ex) {
throw new RuntimeException(ex);
}
}
@Override
public void headerSet(String key, String val) {
_response.setHeader(key, val);
}
@Override
public void headerAdd(String key, String val) {
_response.addHeader(key, val);
}
@Override
public String headerOfResponse(String name) {
return _response.getHeader(name);
}
@Override
public void cookieSet(String key, String val, String domain, String path, int maxAge) {
Cookie c = new Cookie(key, val);
if (Utils.isNotEmpty(path)) {
c.setPath(path);
}
if (maxAge >=
没有合适的资源?快使用搜索试试~ 我知道了~
Java 新的生态,更小、更快、更简单
共29个文件
java:15个
xml:8个
png:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 54 浏览量
2024-04-08
10:43:09
上传
评论
收藏 657KB ZIP 举报
温馨提示
启动快 5 ~ 10 倍;qps 高 2~ 3 倍;运行时内存节省 1/3 ~ 1/2;打包可以缩到 1/2 ~ 1/10。本项目基于 java 17 进行编译和发布,专门争对 jakarta 10,servlet 6.0, jsp 3.1) 相关接口进行“适配”。
资源推荐
资源详情
资源评论
收起资源包目录
solon-jakarta-main.zip (29个子文件)
solon-jakarta-main
solon_icon.png 35KB
pom.xml 1KB
LICENSE 11KB
solon-jakarta-projects
solon-render
solon.view.jsp.jakarta
pom.xml 1KB
src
main
resources
META-INF
solon
solon.view.jsp.jakarta.properties 72B
java
org
noear
solon
view
jsp
XPluginImp.java 717B
tags
AuthRolesTag.java 1KB
AuthPermissionsTag.java 1KB
JspRender.java 2KB
solon-plugin-data
hibernate-jakarta-solon-plugin
pom.xml 842B
solon-boot
solon.boot.undertow.jakarta
pom.xml 839B
solon.boot.undertow.add.jsp.jakarta
pom.xml 847B
solon.boot.jetty.jakarta
pom.xml 838B
solon.boot.jetty.add.jsp.jakarta
pom.xml 844B
solon-web
solon.web.servlet.jakarta
pom.xml 1KB
src
main
java
org
noear
solon
web
servlet
SolonServletFilter.java 3KB
SolonWebSocketEndpoint.java 5KB
MultipartUtil.java 2KB
SolonServletSessionState.java 2KB
SolonServletContextListener.java 4KB
SolonServletHandler.java 940B
AsyncListenerWrap.java 1KB
SolonServletContext.java 10KB
holder
ServletHolder.java 783B
FilterHodler.java 766B
SolonServletInstaller.java 4KB
CONTRIBUTING.md 3KB
solon_schema.png 613KB
.gitignore 305B
共 29 条
- 1
资源评论
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6718
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功