本周日【珠海源创会】一起聊聊:PingCAP分布式事务、支付宝移动端实践、GSBN技术框架选型,点此报名占座

蒋固金 / JModuleLinkMvcJavaApache-2.0

0 Watch 1 Star 1 Fork 0
加入码云
与超过 300 万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
JModuleLink的MVC支持,也可直接使用 展开 收起

蒋固金 最后提交于 update
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README.md

第一部分 简介

JModuleLinkMvcJModuleLinkMVC实现,提供了用于在Action中处理请求与相应的方法,即使不使用JModuleLinkJModuleLinkMvc也可以帮助我们快速构建普通项目。

第二部分 开始使用

使用JModuleLinkMvc可以直接下载源代码编译或者下载已经编译的jar文件,如果您是使用maven来构建项目,也可以直接在pom.xml中添加JModuleLinkMvc的坐标:

Maven central

<!-- http://mvnrepository.com/artifact/com.jianggujin/JModuleLinkMvc -->
<dependency>
    <groupId>com.jianggujin</groupId>
    <artifactId>JModuleLinkMvc</artifactId>
    <version>最新版本</version>
</dependency>

最新的版本可以从Maven仓库或者码云获取。

2.1 JActionContext

JActionContext为模块执行动作的上下文,提供丰富的API处理客户端请求以及常用的操作,即使您不使用JModuleLinkMvc的多模块功能,也可以借助JActionContext完成基本的请求处理,比如参数转JAVA Bean等。我们可以通过如下方式获得一个JActionContext对象

JActionContext context = new JActionContextImpl(request, response);

需要注意的是JAcgionContext封装了常用的方法,如果该类中提供的方法不满足实际需要,可以尝试使用JWebUtils类,该类中存在一些扩展方法。

2.1.1 参数处理

JActionContext中有很多名字以getPara开头的方法,该方法用于获取客户端的请求参数,并且可以将请求参数转化为IntegerLongBoolean等常用的数据类型。

/**
 * 获得请求参数
 * 
 * @param name
 * @return
 */
String getPara(String name);

/**
 * 获得请求参数
 * 
 * @param name
 * @param defaultValue
 * @return
 */
String getPara(String name, String defaultValue);

/**
 * 获得请求参数
 * 
 * @param name
 * @return
 */
String[] getParaValues(String name);

/**
 * 获得整型请求参数
 * 
 * @param name
 * @return
 */
Integer getParaToInt(String name);

/**
 * 获得整型请求参数
 * 
 * @param name
 * @param defaultValue
 * @return
 */
Integer getParaToInt(String name, Integer defaultValue);

/**
 * 获得长整型请求参数
 * 
 * @param name
 * @return
 */
Long getParaToLong(String name);

/**
 * 获得长整型请求参数
 * 
 * @param name
 * @param defaultValue
 * @return
 */
Long getParaToLong(String name, Long defaultValue);

/**
 * 获得布尔型请求参数
 * 
 * @param name
 * @return
 */
Boolean getParaToBoolean(String name);

/**
 * 获得布尔型请求参数
 * 
 * @param name
 * @param defaultValue
 * @return
 */
Boolean getParaToBoolean(String name, Boolean defaultValue);

/**
 * 获得日期型请求参数
 * 
 * @param name
 * @return
 */
Date getParaToDate(String name);

/**
 * 获得日期型请求参数
 * 
 * @param name
 * @param defaultValue
 * @return
 */
Date getParaToDate(String name, Date defaultValue);

/**
 * 将请求参数转换为指定的JavaBean
 * 
 * @param clazz
 * @return
 */
<T> T getParaToBean(Class<T> clazz);

/**
 * 将请求参数转换为指定的JavaBean
 * 
 * @param clazz
 * @param skipConvertError
 * @return
 */
<T> T getParaToBean(Class<T> clazz, boolean skipConvertError);

/**
 * 获得指定类型请求参数
 * 
 * @param name
 * @param clazz
 * @return
 */
<T> T getPara(String name, Class<T> clazz);

/**
 * 获得指定类型请求参数
 * 
 * @param name
 * @param clazz
 * @param defaultValue
 * @return
 */
<T> T getPara(String name, Class<T> clazz, T defaultValue);

/**
 * 获得所有请求参数
 * 
 * @return
 */
Map<String, ?> getParaMap();

/**
 * 获得请求参数名称
 * 
 * @return
 */
Enumeration<String> getParaNames();

如果现有的数据转换器不满足实际使用需求,可以自定义转换器覆盖默认的转换器,或者对转换器进行扩展。编写转换器很容易,我们只需要实现JConverter接口,然后调用JTypeConverter类的register方法即可。默认的转换器如下:

register(Integer.class, new JIntegerConverter());
register(int.class, new JIntegerConverter());
register(Long.class, new JLongConverter());
register(long.class, new JLongConverter());
register(Double.class, new JDoubleConverter());
register(double.class, new JDoubleConverter());
register(Float.class, new JFloatConverter());
register(float.class, new JFloatConverter());
register(Boolean.class, new JBooleanConverter());
register(boolean.class, new JBooleanConverter());
register(java.util.Date.class, new JDateConverter());
register(java.sql.Date.class, new JSqlDateConverter());
register(java.sql.Time.class, new JTimeConverter());
register(java.sql.Timestamp.class, new JTimestampConverter());
register(java.math.BigDecimal.class, new JBigDecimalConverter());
register(java.math.BigInteger.class, new JBigIntegerConverter());
register(byte[].class, new JByteArrayConverter());
register(Short.class, new JShortConverter());
register(short.class, new JShortConverter());
register(Byte.class, new JByteConverter());
register(byte.class, new JByteConverter());

有些特殊的业务场景可能需要修改请求参数,我们可以使用setParaMap方法,但是不建议这样做,避免因使用不当导致参数错误。

除了获取客户端的请求参数,我们可能还需要将一些请求参数回显回页面,使用keepPara可以很容易的做到。

/**
 * 保持请求参数,会将请求参数回设变成{@link HttpServletRequest}属性
 */
JActionContext keepPara();

/**
 * 保持指定的请求参数,会将请求参数回设变成{@link HttpServletRequest}属性
 */
JActionContext keepPara(String... names);

上面介绍的都是获取普通的请求参数,有时候我们可能会在请求路径中添加特殊的参数用于处理,比如Restful API,针对这种情况,JActionContext也提供了获取指定位置的路径参数的方法,具体方法如下:

/**
 * 获得所有路径参数
 */
String[] getPathParas();

/**
 * 获得路径参数个数
 */
int getPathCount();

/**
 * 获得路径参数
 */
String getPathPara(int pos);

/**
 * 获得整型路径参数
 */
Integer getPathParaToInt(int pos);

/**
 * 获得长整型路径参数
 */
Long getPathParaToLong(int pos);

/**
 * 获得布尔型路径参数
 */
Boolean getPathParaToBoolean(int pos);

/**
 * 获得指定类型的路径参数
 */
<T> T getPathPara(int pos, Class<T> clazz);

此处获得的路径参数是去除上下文路径后的结果

2.1.2 Cookie

除了请求参数的处理,Cookie的处理也是相对高频的操作,在JActionContext中,同样提供了针对Cookie的操作方法。

/**
 * 获得Cookie
 */
String getCookie(String name, String defaultValue);

/**
 * 获得Cookie
 */
String getCookie(String name);

/**
 * 设置Cookie
 */
JActionContext setCookie(Cookie cookie);

/**
 * 移除Cookie
 */
JActionContext removeCookie(String name);

JAVA EE5中Cookie没有处理isHttpOnly,如果您需要设置该属性,可以使用JWebUtils.doSetCookie(HttpServletResponse, Cookie, Boolean)方法,直接添加Set-Cookie响应头

2.1.3 属性处理

JActionContextrequestsessionapplication三个级别的属性操作都做了封装,可以直接使用。

/**
 * 设置{@link HttpServletRequest}属性
 * 
 * @param name
 * @param value
 * @return
 */
JActionContext setAttr(String name, Object value);

/**
 * 获得{@link HttpServletRequest}属性
 * 
 * @param name
 * @return
 */
Object getAttr(String name);

/**
 * 设置{@link HttpSession}属性
 * 
 * @param name
 * @param value
 * @return
 */
JActionContext setSessionAttr(String name, Object value);

/**
 * 获得{@link HttpSession}属性
 * 
 * @param name
 * @return
 */
Object getSessionAttr(String name);

/**
 * 设置{@link ServletContext}属性
 * 
 * @param name
 * @param value
 * @return
 */
JActionContext setContextAttr(String name, Object value);

/**
 * 获得{@link ServletContext}属性
 * 
 * @param name
 * @return
 */
Object getContextAttr(String name);

2.1.4 请求体处理

如果客户端提交的不是传统的参数,而是JSONXML等格式的数据,那么我们就需要对请求数据进行特殊处理,JActionContext提供了常用的辅助方法可以将请求的输入流转换所需要的数据。

/**
 * 获得请求数据
 * 
 * @return
 * @throws IOException
 */
byte[] getRequestData() throws IOException;

/**
 * 获得请求体,将请求输入流转换为字符串
 * 
 * @return
 * @throws IOException
 */
String getRequestBody() throws IOException;

/**
 * 获得请求体,将请求输入流转换为字符串
 * 
 * @param charset
 * @return
 * @throws IOException
 */
String getRequestBody(String charset) throws IOException;

/**
 * 获得JSON请求数据
 * 
 * @param clazz
 * @return
 * @throws IOException
 */
<T> T getRequestJson(Class<T> clazz) throws IOException;

/**
 * 获得JSON请求数据
 * 
 * @param clazz
 * @param charset
 * @return
 */
<T> T getRequestJson(Class<T> clazz, String charset);

/**
 * 获得XML请求数据
 * 
 * @param clazz
 * @return
 * @throws IOException
 */
<T> T getRequestXml(Class<T> clazz) throws IOException;

/**
 * 获得XML请求数据
 * 
 * @param clazz
 * @param charset
 * @return
 */
<T> T getRequestXml(Class<T> clazz, String charset);

JSONXML的数据解析需要三方包支持,如果您需要复杂的解析操作,可以参见JRequestResolverManager的使用。

2.1.5 上传文件

上传文件是请求处理中必不可少的一环,JActionContext也提供了相应API进行上传文件的处理。

/**
 * 获得所有上传文件
 */
JMultiValueMap<String, JMultipartFile> getMultipartFiles();

/**
 * 获得上传文件
 */
JMultipartFile getFile(String name);

/**
 * 获得上传文件
 */
List<JMultipartFile> getFiles(String name);

/**
 * 清除上传文件
 */
void cleanupMultipart();

/**
 * 解析上传文件
 */
void parseMultipart(JMultipartResolverConfig config);

如果您的Web容器选择的是Tomcat,则不需要添加任何依赖,默认兼容Tomcat,否则需要添加commons-fileuploadcommons-io包。JModuleLinkMvc默认会先加载Tomcat,然后加载commons包,如果二者都不满足,则无法使用上传文件功能。

如果您有自己喜欢的解析方式,也可以指定自己的上传文件解析的类实现,该类需要实现JMultipartResolver接口,然后调用JMultipartResolverFactory类的useMultipartResolver方法即可。

commons-fileuploadmaven坐标如下:

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
</dependency>

2.1.6 响应渲染

以上部分都是处理客户端的请求,有请求自然会有响应,JActionContext默认集成了一些常用的渲染。

 /**
 * 文本响应
 * 
 * @param txt
 * @throws ServletException
 * @throws IOException
 */
void renderText(String txt) throws IOException, ServletException;

/**
 * 请求转发
 * 
 * @param path
 * @throws ServletException
 * @throws IOException
 */
void renderDispatcher(String path) throws IOException, ServletException;

/**
 * 重定向
 * 
 * @param path
 * @throws ServletException
 * @throws IOException
 */
void renderRedirect(String path) throws IOException, ServletException;

/**
 * 异常响应
 * 
 * @param code
 * @throws IOException
 * @throws ServletException
 */
void renderError(int code) throws IOException, ServletException;

/**
 * JSON响应
 * 
 * @param json
 * @throws IOException
 * @throws ServletException
 */
void renderJson(Object json) throws IOException, ServletException;

/**
 * XML响应
 * 
 * @param xml
 * @throws IOException
 * @throws ServletException
 */
void renderXml(Object xml) throws IOException, ServletException;

JSONXML的数据解析需要三方包支持,如果上述渲染您的需求,您可以使用JRenderManager类来进行不同业务要求的渲染。

2.2 JRequestResolverManager

该类为请求解析器的管理类,使用该类可以将JSONXML格式的请求解析为Java Bean,对于JSON格式的数据解析,JModuleLinkMvc默认集成了jacksonfastjson,加载顺序为:jackson>fastjsonXML格式的数据解析,JModuleLinkMvc默认集成了jacksonXStreamJAXB,加载顺序为:jackson>XStream>JAXB

如果默认集成的解析器不满足实际需求, 可以编写自己的实现类,该类需要实现JRequestResolver接口,然后调用JRequestResolverManager类的useJsonResolver方法或useXmlResolver方法。

在该类中提供了如下四个方法,可用于将客户端请求数据转换为Java Bean。

public static <T> T getBeanFromBodyWithJson(Class<T> clazz, JActionContext context)
      throws IOException;

public static <T> T getBeanFromBodyWithJson(Class<T> clazz, JActionContext context, 
      String charset);

public static <T> T getBeanFromBodyWithXml(Class<T> clazz, JActionContext context)
      throws IOException;

public static <T> T getBeanFromBodyWithXml(Class<T> clazz, JActionContext context,
      String charset);

相关三方包的maven坐标如下:

<dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
    <version>1.4.9</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.8.0</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.8.10</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.10</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.8.10</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.9</version>
</dependency>

2.3 JRenderManager

该类为响应渲染器管理器,JModuleLinkMvc内置的渲染器都可以在该类中找到,同时该类支持注册自定义渲染器。该类默认集成了验证码异常文件JSON二维码重定向请求转发文本XML的渲染,这些渲染器并不一定全部可以正常工作,部分需要依赖三方包。

对于JSONXML格式数据的响应与JRequestResolverManager类似,依赖的三方包可参考JRequestResolverManager

二维码的响应渲染器集成的是zxing包,maven坐标如下:

<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>javase</artifactId>
    <version>3.2.1</version>
</dependency>

2.4 JGenericHttpAction和JHttpAction

为了更好的利用JModuleLink处理Web请求,JModuleLinkMvc中默认提供了两个JAction的实现,如果我们的操作是与请求方法无关的,那么我们在编写JAction的实现时可以直接继承JGenericHttpAction,反之则使用JHttpAction,这两者的关系有点类似GenericServletHttpServlet

项目点评 ( 0 )

你可以在登录后,发表评论

搜索帮助

12_float_left_people 12_float_left_close