星期天写了点蛋疼的东西(2)
2012-08-15 14:32
267 查看
续上篇,蛋疼(1)
package org.J.v;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import org.J.c.Action;
import org.J.c.RenderType;
import org.J.conf.JFrameConstants;
import org.J.conf.JFrameLogger;
import org.J.m.JModel;
import org.J.res.Encoding;
/**
* 只实现了JSP 显示器,其他的用到的,可以随意实现View借口
* 1.普通返回指向页面 ([a-zA-Z]|$)+
* 2.重定向
重定向到 想同 namespace other action r:([a-zA-Z]|$)+
重定向到 不同 namespace other action r:/([a-zA-Z]|$)+
* 3.转发
* 转发到 想同 namespace other action d:([a-zA-Z]|$)+
* 转发到 不同 namespace other action d:/([a-zA-Z]|$)+
* r:redirect 重定向 response.sendRedirect(view);
* r(1)> return 'r:action1'
* r(2)> return 'r:/action1'
* d:dispatcher request.getRequestDispatcher(view).forward(request,response);
* d(1)> return 'd:action1' 指向本命名空间下的action1
* d(2)> return 'd:/test/action2' 指向命名空间根目录的action2
*
* 表达式中的/代表 需要写'相对的'绝对路径
* 例如 有如下目录
* WebContent/ac1
* WebContent/portal/ac2
* WebContent/portal/main/ac3
* WebContent/portal/sub1/ac4
* WebContent/portal/sub1/ac5
*
* 从ac3到ac5的转发就要写 d:/portal/sub1/ac5
* 其中,包括2部分内容,一个就是url头'd:/',一个就是指向的具体路径 portal/sub1/ac5,即ac5的actionKey
*/
@SuppressWarnings({"serial", "unchecked"})
public class Render {
/**项目编译后,文件所在目录*/
final static String appCompileFouder=JFrameConstants.classResourcePath;
/**全局设置的页面存放路径*/
final static String webViewRootPath=JFrameConstants.viewRoot.replace("\\", "/");
static RenderType renderType;
/**
* 这个参数改为一个ActionContextRequire对象
* 然后把有用的信息封装进去
* 避免和org.J.c.Action 巨耦合
* @param ac
* @return
*/
public static final View renderFilter(Action ac,Object result){
/**调试输出若干Action信息**/
JFrameLogger.ActionConsoleView(ac);
sysoAppInfo();
org.J.annotation.action.Action action=ac.getMethod().getAnnotation(org.J.annotation.action.Action.class);
if(action!=null){
renderType=action.renderType();
if(renderType.equals(RenderType.jsp)){
return new JspRender(ac,result);
}else if(renderType.equals(RenderType.json)){
return new JsonRender(ac,result);
}
}else{
// action:execute
}
return null;
}
private static void sysoAppInfo() {
JFrameLogger.logger.debug(String.format("app appCompileFouder '%s':",appCompileFouder));
JFrameLogger.logger.debug(String.format("app web root '%s':",webViewRootPath));
}
static class JspRender extends View{
public JspRender(Action ac,Object result){
this(ac);
this.actionResultObj=result;
if(result instanceof String){
this.view=(String)result;
}
}
public JspRender(Action ac){
this.actionInstance =ac;
this.request=ac.getHttpServletRequest();
this.response=ac.getHttpServletResponse();
}
@Override
public View handlerAfterAction() {
for (Enumeration<String> attrs = request.getAttributeNames(); attrs.hasMoreElements();) {
String key = attrs.nextElement();
Object value = request.getAttribute(key);
if (value instanceof JModel) {
request.setAttribute(key, handleModel((JModel)value));
}
else if (value instanceof List) {
List temp = (List)value;
if (temp.size() > 0) {
Object o = temp.get(0);
if (o instanceof JModel)
request.setAttribute(key, handleModelList((List<JModel>)value));
}
}
else if (value instanceof JModel[]) {
this.request.setAttribute(key, handleModelArray((JModel[])value));
}
}
return this;
}
private Map<String,Object> handleModel(JModel model){
return model.getAttrsInSession();
}
private List<Map<String, Object>> handleModelList(List<JModel> list) {
List<Map<String, Object>> result = new ArrayList<Map<String, Object>>(list.size());
for (JModel model : list)
result.add(model.getAttrsInSession());
return result;
}
private List<Map<String, Object>> handleModelArray(JModel[] array) {
List<Map<String, Object>> result = new ArrayList<Map<String, Object>>(array.length);
for (JModel model : array)
result.add(model.getAttrsInSession());
return result;
}
/**
* 目前只支持返回Map 或者 url
* @return
*/
ReturnInfo getReturnInfo(){
ReturnInfo result=null;
if(actionResultObj!=null){
result=new ReturnInfo();
}
//普通返回路径
if(actionResultObj instanceof String){
String urlStemp=(String)actionResultObj;
if(urlStemp.toLowerCase().startsWith("r:")==false&&urlStemp.toLowerCase().startsWith("d:")==false
&&urlStemp.toLowerCase().startsWith("r:/")==false&&urlStemp.toLowerCase().startsWith("d:/")==false){
result.setDip(RenderDip.Normal);
}else if(urlStemp.toLowerCase().startsWith("r:")==true&&urlStemp.toLowerCase().startsWith("r:/")==false){
result.setDip(RenderDip.redirect);
}else if(urlStemp.toLowerCase().startsWith("r:")==false&&urlStemp.toLowerCase().startsWith("r:/")==true){
result.setDip(RenderDip.redirect$);
}else if(urlStemp.toLowerCase().startsWith("d:")==true&&urlStemp.toLowerCase().startsWith("d:/")==false){
result.setDip(RenderDip.dispatcher);
}else if(urlStemp.toLowerCase().startsWith("d:")==false&&urlStemp.toLowerCase().startsWith("d:/")==true){
result.setDip(RenderDip.dispatcher$);
}
JFrameLogger.logger.debug(String.format("in getReturnInfo 返回 :%s",result.getDip()));
}else if(actionResultObj instanceof Map){
Map<String,Object> mapStemp=((Map<String,Object>)actionResultObj);
for(Entry<String, Object> entry : mapStemp.entrySet()){
this.request.setAttribute(entry.getKey(),entry.getValue());
}
result.setDip(RenderDip.Normal);
}
return result;
}
@Override
public void render() {
if(appCompileFouder.contains(webViewRootPath)){
String temp=appCompileFouder.substring(0,appCompileFouder.indexOf(webViewRootPath)+webViewRootPath.length());
ReturnInfo returnInfo= getReturnInfo();
/**同一space下转发*/
if(returnInfo.getDip().equals(RenderDip.Normal)){
//磁盘存放页面路径
String diskFile=temp+(this.actionInstance.getNamespace().substring(1)+View.gen+this.view+"."+renderType);
JFrameLogger.logger.debug("智能ABC="+diskFile);
//request.getRequestDispatcher需要的相对路径
String fowardFile=View.gen+(this.actionInstance.getNamespace().substring(1)+View.gen+this.view+"."+renderType);
JFrameLogger.logger.debug(String.format(Locale.getDefault(),"返回文件是 路径是 '%s':",fowardFile));
file=new File(diskFile);
if(file.exists()){
try {
JFrameLogger.logger.debug(String.format("目标地址:%s",fowardFile));
request.getRequestDispatcher(fowardFile).forward(request,response);
} catch (ServletException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}else{
JFrameLogger.logger.debug(String.format("GOTO 404 Page 不存在 %s",fowardFile));
}
}
/**同族转发**/
else if(returnInfo.getDip().equals(RenderDip.dispatcher)){
}
/**跨族转发**/
else if(returnInfo.getDip().equals(RenderDip.dispatcher$)){
}
/**国内重定向**/
else if(returnInfo.getDip().equals(RenderDip.redirect)){
}
/**跨国重定向**/
else if(returnInfo.getDip().equals(RenderDip.redirect$)){
}
}
}
}
static class HtmlRender extends View{
private static final String contentType = "text/html;charset=" + Encoding.UTF8;
private String text;
public HtmlRender(String text) {
this.text = text;
}
public HtmlRender(Action ac){
this.actionInstance =ac;
this.request=ac.getHttpServletRequest();
this.response=ac.getHttpServletResponse();
}
public HtmlRender(Action ac,Object result){
this(ac);
if(result instanceof String){
this.text=(String)result;
}
}
@Override
public View handlerAfterAction() {
return null;
}
@Override
public void render() {
PrintWriter writer = null;
try {
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType(contentType);
writer = response.getWriter();
writer.write(text);
writer.flush();
} catch (IOException e) {
throw new RenderException(e);
}
finally {
writer.close();
}
}
}
static class JsonRender extends View{
private static final String contentType="application/json;charset=" + Encoding.UTF8;
private String jsonString;
public JsonRender(){}
public JsonRender(Action ac,Object result){
this(ac);
if(result instanceof String){
jsonString=(String)result;
}
}
public JsonRender(Action ac){
this.actionInstance =ac;
this.request=ac.getHttpServletRequest();
this.response=ac.getHttpServletResponse();
}
public JsonRender(String viewPath){ this.view = viewPath;}
public JsonRender(String viewPath,String json){ this.view = viewPath; this.jsonString = json ;}
PrintWriter writer;
@Override
public View handlerAfterAction() {
return this;
}
@Override
public void render() {
try {
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType(contentType);
writer = response.getWriter();
writer.write(jsonString);
writer.flush();
} catch (IOException e) {
throw new RenderException(e);
}
}
}
/**
* 1.普通返回指向页面 ([a-zA-Z]|$)+
* 2.重定向
* 重定向到 想同 namespace other action r:([a-zA-Z]|$)+
* 重定向到 不同 namespace other action r:/([a-zA-Z]|$)+
* 3.转发
* 转发到 想同 namespace other action d:([a-zA-Z]|$)+
* 转发到 不同 namespace other action d:/([a-zA-Z]|$)+
* @author Gelopa
*
*/
static enum RenderDip{
Normal,
redirect,
redirect$,
dispatcher,
dispatcher$
}
/**
* 数据返回使者
* @author Gelopa
*
*/
static class ReturnInfo {
RenderDip dip;
RenderType renderType;
HttpServletRequest request;
public RenderDip getDip() {
return dip;
}
public void setDip(RenderDip dip) {
this.dip = dip;
}
public HttpServletRequest getRequest() {
return request;
}
public void setRequest(HttpServletRequest request) {
this.request = request;
}
public RenderType getRenderType() {
return renderType;
}
public void setRenderType(RenderType renderType) {
this.renderType = renderType;
}
}
}
package org.J.v;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import org.J.c.Action;
import org.J.c.RenderType;
import org.J.conf.JFrameConstants;
import org.J.conf.JFrameLogger;
import org.J.m.JModel;
import org.J.res.Encoding;
/**
* 只实现了JSP 显示器,其他的用到的,可以随意实现View借口
* 1.普通返回指向页面 ([a-zA-Z]|$)+
* 2.重定向
重定向到 想同 namespace other action r:([a-zA-Z]|$)+
重定向到 不同 namespace other action r:/([a-zA-Z]|$)+
* 3.转发
* 转发到 想同 namespace other action d:([a-zA-Z]|$)+
* 转发到 不同 namespace other action d:/([a-zA-Z]|$)+
* r:redirect 重定向 response.sendRedirect(view);
* r(1)> return 'r:action1'
* r(2)> return 'r:/action1'
* d:dispatcher request.getRequestDispatcher(view).forward(request,response);
* d(1)> return 'd:action1' 指向本命名空间下的action1
* d(2)> return 'd:/test/action2' 指向命名空间根目录的action2
*
* 表达式中的/代表 需要写'相对的'绝对路径
* 例如 有如下目录
* WebContent/ac1
* WebContent/portal/ac2
* WebContent/portal/main/ac3
* WebContent/portal/sub1/ac4
* WebContent/portal/sub1/ac5
*
* 从ac3到ac5的转发就要写 d:/portal/sub1/ac5
* 其中,包括2部分内容,一个就是url头'd:/',一个就是指向的具体路径 portal/sub1/ac5,即ac5的actionKey
*/
@SuppressWarnings({"serial", "unchecked"})
public class Render {
/**项目编译后,文件所在目录*/
final static String appCompileFouder=JFrameConstants.classResourcePath;
/**全局设置的页面存放路径*/
final static String webViewRootPath=JFrameConstants.viewRoot.replace("\\", "/");
static RenderType renderType;
/**
* 这个参数改为一个ActionContextRequire对象
* 然后把有用的信息封装进去
* 避免和org.J.c.Action 巨耦合
* @param ac
* @return
*/
public static final View renderFilter(Action ac,Object result){
/**调试输出若干Action信息**/
JFrameLogger.ActionConsoleView(ac);
sysoAppInfo();
org.J.annotation.action.Action action=ac.getMethod().getAnnotation(org.J.annotation.action.Action.class);
if(action!=null){
renderType=action.renderType();
if(renderType.equals(RenderType.jsp)){
return new JspRender(ac,result);
}else if(renderType.equals(RenderType.json)){
return new JsonRender(ac,result);
}
}else{
// action:execute
}
return null;
}
private static void sysoAppInfo() {
JFrameLogger.logger.debug(String.format("app appCompileFouder '%s':",appCompileFouder));
JFrameLogger.logger.debug(String.format("app web root '%s':",webViewRootPath));
}
static class JspRender extends View{
public JspRender(Action ac,Object result){
this(ac);
this.actionResultObj=result;
if(result instanceof String){
this.view=(String)result;
}
}
public JspRender(Action ac){
this.actionInstance =ac;
this.request=ac.getHttpServletRequest();
this.response=ac.getHttpServletResponse();
}
@Override
public View handlerAfterAction() {
for (Enumeration<String> attrs = request.getAttributeNames(); attrs.hasMoreElements();) {
String key = attrs.nextElement();
Object value = request.getAttribute(key);
if (value instanceof JModel) {
request.setAttribute(key, handleModel((JModel)value));
}
else if (value instanceof List) {
List temp = (List)value;
if (temp.size() > 0) {
Object o = temp.get(0);
if (o instanceof JModel)
request.setAttribute(key, handleModelList((List<JModel>)value));
}
}
else if (value instanceof JModel[]) {
this.request.setAttribute(key, handleModelArray((JModel[])value));
}
}
return this;
}
private Map<String,Object> handleModel(JModel model){
return model.getAttrsInSession();
}
private List<Map<String, Object>> handleModelList(List<JModel> list) {
List<Map<String, Object>> result = new ArrayList<Map<String, Object>>(list.size());
for (JModel model : list)
result.add(model.getAttrsInSession());
return result;
}
private List<Map<String, Object>> handleModelArray(JModel[] array) {
List<Map<String, Object>> result = new ArrayList<Map<String, Object>>(array.length);
for (JModel model : array)
result.add(model.getAttrsInSession());
return result;
}
/**
* 目前只支持返回Map 或者 url
* @return
*/
ReturnInfo getReturnInfo(){
ReturnInfo result=null;
if(actionResultObj!=null){
result=new ReturnInfo();
}
//普通返回路径
if(actionResultObj instanceof String){
String urlStemp=(String)actionResultObj;
if(urlStemp.toLowerCase().startsWith("r:")==false&&urlStemp.toLowerCase().startsWith("d:")==false
&&urlStemp.toLowerCase().startsWith("r:/")==false&&urlStemp.toLowerCase().startsWith("d:/")==false){
result.setDip(RenderDip.Normal);
}else if(urlStemp.toLowerCase().startsWith("r:")==true&&urlStemp.toLowerCase().startsWith("r:/")==false){
result.setDip(RenderDip.redirect);
}else if(urlStemp.toLowerCase().startsWith("r:")==false&&urlStemp.toLowerCase().startsWith("r:/")==true){
result.setDip(RenderDip.redirect$);
}else if(urlStemp.toLowerCase().startsWith("d:")==true&&urlStemp.toLowerCase().startsWith("d:/")==false){
result.setDip(RenderDip.dispatcher);
}else if(urlStemp.toLowerCase().startsWith("d:")==false&&urlStemp.toLowerCase().startsWith("d:/")==true){
result.setDip(RenderDip.dispatcher$);
}
JFrameLogger.logger.debug(String.format("in getReturnInfo 返回 :%s",result.getDip()));
}else if(actionResultObj instanceof Map){
Map<String,Object> mapStemp=((Map<String,Object>)actionResultObj);
for(Entry<String, Object> entry : mapStemp.entrySet()){
this.request.setAttribute(entry.getKey(),entry.getValue());
}
result.setDip(RenderDip.Normal);
}
return result;
}
@Override
public void render() {
if(appCompileFouder.contains(webViewRootPath)){
String temp=appCompileFouder.substring(0,appCompileFouder.indexOf(webViewRootPath)+webViewRootPath.length());
ReturnInfo returnInfo= getReturnInfo();
/**同一space下转发*/
if(returnInfo.getDip().equals(RenderDip.Normal)){
//磁盘存放页面路径
String diskFile=temp+(this.actionInstance.getNamespace().substring(1)+View.gen+this.view+"."+renderType);
JFrameLogger.logger.debug("智能ABC="+diskFile);
//request.getRequestDispatcher需要的相对路径
String fowardFile=View.gen+(this.actionInstance.getNamespace().substring(1)+View.gen+this.view+"."+renderType);
JFrameLogger.logger.debug(String.format(Locale.getDefault(),"返回文件是 路径是 '%s':",fowardFile));
file=new File(diskFile);
if(file.exists()){
try {
JFrameLogger.logger.debug(String.format("目标地址:%s",fowardFile));
request.getRequestDispatcher(fowardFile).forward(request,response);
} catch (ServletException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}else{
JFrameLogger.logger.debug(String.format("GOTO 404 Page 不存在 %s",fowardFile));
}
}
/**同族转发**/
else if(returnInfo.getDip().equals(RenderDip.dispatcher)){
}
/**跨族转发**/
else if(returnInfo.getDip().equals(RenderDip.dispatcher$)){
}
/**国内重定向**/
else if(returnInfo.getDip().equals(RenderDip.redirect)){
}
/**跨国重定向**/
else if(returnInfo.getDip().equals(RenderDip.redirect$)){
}
}
}
}
static class HtmlRender extends View{
private static final String contentType = "text/html;charset=" + Encoding.UTF8;
private String text;
public HtmlRender(String text) {
this.text = text;
}
public HtmlRender(Action ac){
this.actionInstance =ac;
this.request=ac.getHttpServletRequest();
this.response=ac.getHttpServletResponse();
}
public HtmlRender(Action ac,Object result){
this(ac);
if(result instanceof String){
this.text=(String)result;
}
}
@Override
public View handlerAfterAction() {
return null;
}
@Override
public void render() {
PrintWriter writer = null;
try {
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType(contentType);
writer = response.getWriter();
writer.write(text);
writer.flush();
} catch (IOException e) {
throw new RenderException(e);
}
finally {
writer.close();
}
}
}
static class JsonRender extends View{
private static final String contentType="application/json;charset=" + Encoding.UTF8;
private String jsonString;
public JsonRender(){}
public JsonRender(Action ac,Object result){
this(ac);
if(result instanceof String){
jsonString=(String)result;
}
}
public JsonRender(Action ac){
this.actionInstance =ac;
this.request=ac.getHttpServletRequest();
this.response=ac.getHttpServletResponse();
}
public JsonRender(String viewPath){ this.view = viewPath;}
public JsonRender(String viewPath,String json){ this.view = viewPath; this.jsonString = json ;}
PrintWriter writer;
@Override
public View handlerAfterAction() {
return this;
}
@Override
public void render() {
try {
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType(contentType);
writer = response.getWriter();
writer.write(jsonString);
writer.flush();
} catch (IOException e) {
throw new RenderException(e);
}
}
}
/**
* 1.普通返回指向页面 ([a-zA-Z]|$)+
* 2.重定向
* 重定向到 想同 namespace other action r:([a-zA-Z]|$)+
* 重定向到 不同 namespace other action r:/([a-zA-Z]|$)+
* 3.转发
* 转发到 想同 namespace other action d:([a-zA-Z]|$)+
* 转发到 不同 namespace other action d:/([a-zA-Z]|$)+
* @author Gelopa
*
*/
static enum RenderDip{
Normal,
redirect,
redirect$,
dispatcher,
dispatcher$
}
/**
* 数据返回使者
* @author Gelopa
*
*/
static class ReturnInfo {
RenderDip dip;
RenderType renderType;
HttpServletRequest request;
public RenderDip getDip() {
return dip;
}
public void setDip(RenderDip dip) {
this.dip = dip;
}
public HttpServletRequest getRequest() {
return request;
}
public void setRequest(HttpServletRequest request) {
this.request = request;
}
public RenderType getRenderType() {
return renderType;
}
public void setRenderType(RenderType renderType) {
this.renderType = renderType;
}
}
}
相关文章推荐
- 星期天写了点蛋疼的东西(1)
- 星期天写了点蛋疼的东西(3)
- 蛋疼时候的一些东西
- 作为一个大学才开始入门学计算机编程的孩子想要的东西-----听我扯,你蛋疼,他菊紧,我开心
- 作为一个大学才开始入门学计算机编程的孩子想要的东西-----听我扯,你蛋疼,他菊紧,我开心
- 蛋疼:神马搜索究竟是个神马东西?
- 正则表达式到底是什么东西??
- 电气工程师必备的东西
- Nest,很酷的东西
- 关于位域的一些东西
- 内存调试的东西D/dalvikvm( 809 ): GC_CONCURRENT freed
- 想学IOS开发高阶一点的东西,从何开始
- 【转】使用screen的一些技巧性东西
- 百度地图之清单文件需备注什么东西
- 写个东西还要审核么,昨天的还没写完,今天找不了,隐藏了,别给我自己隐藏啊
- malloc使用细节(东西虽小,出现问题影响挺大,注意留意)
- >>今天逛MS网站,发现如下东西:
- 你关心的东西决定了你的层次
- Object-C 相关东西
- 这几天回家了一趟,奶奶病了,把笔记本带回家,本想用在家的几天把MSN方面的东西整理一下贴出来的!