控制器

srczh.jar的控制层即控制器为框架控制系统流转的重要一环节,主要涵盖了请求、接收、参数、对象注入、系统响应、日志等。

控制器介绍

控制器对象

控制器对象不是Java内置对象,但概念上相同,java内置对象正常使用,这相当于是扩展。
控制器类继承SrcAction 或 SrcController类便可使用。

控制器提供方法

返回名称参数说明
HttpServletRequestgetRequest获取request对象
HttpServletResponsegetResponse获取response对象
MapgetPmap获取请求参数
voidsrcBindString name,Object val控制器向返回绑定输出对象数据
ObjectgetBindString name控制器方法获取绑定的值
voidsetSessionString name,Object val设置session
ObjectgetSessionString session获取session
voidremoveSessionString session删除session
voidwriteString chars返回输出字符
MapcheckLoginString logintype用于检查登录
voidredoString url拦截未登录后可以使用该方法跳转
voidinitCommMap user,String comm设定用户访问监管
booleancheckCommString comm使用监管(防止重复操作)

请求

这里的请求是指用户向系统发起一个请求,每一次请求都是用户与系统的交互,会话的一次开始,通常web系统中的均为http请求,下面将描述srczh.jar框架中是如何发起请求和处理的。

a链接

通过点击a标签发起链接网页请求,如果是静态直接指向静态网页文件地址,如果需要框架控制器处理则需要按照配置文件中核心配置的监控范围来使用

1
<a href="/src/user/register" >注册</a>

1.上面的示例代码a链接标签中地址 “/src” 为控制器接收请求范围

2.第2位“/user” 表示发送到名为UserAction的控制器,若配置文件中监控类型是controller则监控类为UserController

3.第3位“/register” 控制器中的执行方法register,该级若无默认方法index

form表单

提交数据最常用的方式,属性action中用法及解释等同于a链接标签

1
2
3
4
<form action="/src/user/login" method="post">
<input type="text" name="user">
<input type="password" name="password">
</form >
注:只要是需要控制器接收的动态请求如ajax、标签、表单、iframe等请求方式都要按照上面的控制器配置规则来使用

接收

接收是指srczh.jar框架中处理用户请求的控制器方法工作形式,一个控制器方法可以被用户请求调用,也可以被其它控制器方法调用,下面描述几种控制器接收请求的场景。

默认方式接收

在控制器类中我们默认的接收方法index(),该方法可以接收处理不指定方法的请求。

1
<a href="/src/login?uname=jun" >登录</a>
1
2
3
4
5
6
7
8
9
10
11
12
13
public class LoginAction extends SrcAction{
     
    private LoginDao ldao;
    /**
     * 默认接收方法
     * @return
     */
    public Object[] index() {
        Map pmap = this.getPmap();
        Map rmap=ldao.login(pmap);
        return new Object[] {"/WEB-INF/html/user.html",rmap};
    }
}

上面示例代码中控制器方法index返回数组为Object数组对象是返回URL和数据,也可以使用下面绑定机制返回数据.

1
2
3
4
5
6
7
8
9
10
/**
 * 默认接收方法
 * @return
 */
public String index() {
    Map pmap = this.getPmap();
    Map rmap=ldao.login(pmap);
    this.srcBind("rs", rmap);   //返回数据rmap绑定到rs变量中前端可以通过标签获取rs的值
    return "/WEB-INF/html/user.html";
}

分析:a链接标签中的请求路径“/src”表示该请求指定为控制器动态响应接收请求,“/login”为指定控制器LoginAction,Action则为配置文件中设定的控制器类型,上面没有指定方法则自动分配index方法接收

指定方法接收

下面示例一个去注册页面的请求使用指定方法接收

1
<a href="/src/login/toRegis">去注册</a>
1
2
3
4
5
6
7
/**
 * 跳转到注册页面
 */
public String toRegis(){
    return "/WEB-INF/user/toRegis.html";
}

a链接标签请求发起中“/toRegis” 对应控制器中的toRegis方法,接收方法请区分大小写

参数

用户在请求回话中往往需要向系统提交数据,这些数据通常都是先编个号提交有利于在控制器中获取,而这些编号就称为数据参数

数据类型参数

以基础数据类型参数传递方式,可以是a链接、form表单、ajax、iframe以及标签等

1
<a href="/src/user/login?uname=jun&tel=133138139" >登录</a>
1
2
3
4
<form action="/src/user/login" method="post">
  <input type="text" name="uname" value="jun">
  <input type="text" name="tel" value="133136138">
</form >

数据类型参数获取

基础数据类型的参数在控制器中都已经封装到map中,当然您还是可以直接使用requesr.getParameter("*"),下面代码中uname和uname2的值相同

1
2
3
4
5
6
7
8
9
10
11
public Object[] index() {
    Map pmap = this.getPmap();
    //注释1:直接在pmap中获取传递参数
    String uname=pmap.get("uname").toString();
     
    //注释2:直接在request中得到传递参数
    String uname2=this.getRequest().getParameter("uname");
     
    Map rmap=ldao.login(pmap);
    return new Object[] {"/WEB-INF/html/user.html",rmap};
}

实体类型参数

实体类型的传递与上面基础数据类型区别在于参数的定义需要一个实体类实例名,这个实例名user将对控制器中实体类对象进行绑定

1
<a href="/src/user/login?user.uname=jun&user.tel=133138139" >登录</a>
1
2
3
4
<form action="/src/user/login" method="post">
  <input type="text" name="user.name" value="jun">
  <input type="text" name="user.tel" value="133136138">
</form >

实体类型参数获取

在控制器中需要定义这个实体类实例,以做到传参和实例对象绑定,srczh.jar框架绑定不需要get或set申明。

1
2
//需要绑定的参数对象
private User user;

在方法中得到绑定对象参数,请看方法中注释3,如使用对象传参,注释1和注释2将获取不到数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
 * 默认接收方法
 * @return
 */
public Object[] index() {
    Map pmap = this.getPmap();
    //注释1:直接在pmap中获取传递参数
    String uname=pmap.get("uname").toString();
     
    //注释2:直接在request中得到传递参数
    String uname2=this.getRequest().getParameter("uname");
     
    //注释3:在绑定对象中获取参数值
    String uname3=user.getUname();
     
    Map rmap=ldao.login(pmap);
    return new Object[] {"/WEB-INF/html/user.html",rmap};
}

注入

目前srczh.jar框架架构中,我们不愿意见到太多的配置文件,所以注入这一块是很弱的,仅仅只是在控制器中把业务层的对象注入进来,当然了如场景需要你仍然可以去new

申明注入对象实例

在控制器类中申明一个业务层的接口对象,不同于spring,属性对象不需要去get或set,在生效之前,系统中应当已经建立好了dao业务层。

1
2
//申明业务层注入对象
private LoginDao ldao;

创建和生效之前,需要已经建立好了dao业务层如下,对应实现业务层的类的命名一定是dao包下***DaoImpl.java。

业务层

这时候启动应用,注入对象会在框架初始化的过程中被管理注入进来

业务注入

使用的话,直接在控制器方法中调用注入对象的所有对象方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
 * 默认接收方法
 * @return
 */
public Object[] index() {
    Map pmap = this.getPmap();
    //注释1:直接在pmap中获取传递参数
    String uname=pmap.get("uname").toString();
     
    //注释2:直接在request中得到传递参数
    String uname2=this.getRequest().getParameter("uname");
     
    //注释3:在绑定对象中获取参数值
    String uname3=user.getUname();
     
    //使用注入业务对象
    Map rmap=ldao.login(pmap);
     
    //直接new业务对象
    LoginDao ldao2=new LoginDaoImpl();
    Map rmap2=ldao2.login(pmap);
     
    return new Object[] {"/WEB-INF/html/user.html",rmap};
}

请注意方法中两段不同的注释:使用注入和直接new

//使用注入业务对象

//直接new业务对象

两种方式同时都能正常调用,注入对象是单例的使用注入方式比new有很多好处和优势,我们推荐第一种方式。

响应

当控制器完成了用户的请求逻辑,找到了用户所需的文件或数据等返回对象,就需要将返回对象响应给客户,用户获取展现后表示一次请求回话结束。 srczh.jar框架中响应有下面几种场景,返回静态页面及数据、返回动态资源页面、响应对象、返回文件流、返回模板等,配合使用srczh新标签可以很好的组织各种内容、html、js、xml、json、包括word、excel等文件。

返回静态页面及数据

以下几种普通的响应方式,在控制器中处理请求后直接返回目标页面到客户端

1
2
3
4
5
6
7
/**
 * 跳转到注册页面
 */
public String toRegis(){
    return "/WEB-INF/html/login/toRegis.html";
}
1
2
3
4
5
6
7
8
9
/**
 * 跳转到注册页面
 */
public Object[] toRegis(){
    Map rmap = new HashMap();
    rmap.put("message""欢迎注册");
    //返回注册页面以及message消息
    return new Object[] {"/WEB-INF/user/toRegis.html",rmap};
}

示例1中控制器方法return字符串为一个静态页面的地址路径。
示例2对象是数组,数组第一参数是返回的实际页面地址路径,第二参数为输出数据。

返回动态资源页面

返回另外一个动态页面,下面注释中两种返回效果都相同指向上一个方法,但是内部流转不相同。

1
2
3
4
5
6
7
/**返回注册*/
public Object[] notLogin(){
    //通过返回再转向
    //return new Object[] {"/src/login/toRegis",null};
    //通过调用方法转向
    return toRegis();
}

响应对象

srczh.jar还提供一个内置响应对象SrcView
使用响应对象SrcView返回页面

1
2
3
4
5
6
7
8
9
/**返回首页*/
public SrcView toIndex(){
    Map rmap = new HashMap();
    rmap.put("message""欢迎访问");
    SrcView sv = new SrcView();
    sv.setData(rmap);
    sv.setUrl("/index.html");
    return sv;
}

防重复提交

srczh.jar防重机制和令牌机制类似,在使用过程中也更加简单,如在需要防重复提交的前动作中我们预先加入请求标识,在控制器如下使用

1
this.initComm("project");

重复请求拦截只需要在作用控制器方法中加入判断语句代码如下

1
2
3
4
if(!checkComm("project")) {
    this.write("{\"state\":\"-1\",\"message\":\"请不要重复提交!\"}");
    return;
}

数据转换类

SrcView 控制器为响应提供数据转换类

url响应对象地址一般为请求页面地址路径或输出模板地址如:
"/WEB-INF/html/regis.html","/WEB-INF/temp/wdj.tmp"
name响应对象名非必须
data响应对象数据如响应无输出非必须
type响应对象类型可以指定doc、csv,若默认响应网页文件可以为空

SrcJson 控制器为输出提供数据工具类

返回方法参数说明
MapputString key, Object value以map形式追加任意数据
voidclear清空数据
ObjectgetString key按key值获取数据
StringtoString转换成字符形态
StringtoStringObject obj指定对象转换成字符形态
StringListToStrList list将List转换成字符
StringArrayToStrObject object将数组转成字符
SrcJsonBeantoJsonObject bean将实体Bean转成Json
SrcJsonMapToJsonMap map将Map转成Json
MapJsonToMapString string将Json字符转成Map

输出指定文件

输出文件供用户下载。

1
2
3
4
5
6
7
8
/**文件下载*/
public void downFile() {
    try {
        this.srcDownFile("/文件地址");
    catch (IOException e) {
        e.printStackTrace();
    }
}

导出doc

导出Word功能,需要先制作doc模板,在模板上使用src标签绑定数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
   *   按模板导出word文件并下载
 * @return
 */
public SrcView iword() {
    //组织数据
    Map map = new HashMap();
    map.put("docname""zhoujun");
     
    SrcView sv=new SrcView();
    sv.setType("doc");
    sv.setData(map);
    sv.setUrl("/WEB-INF/temp/wdj.tmp");
    return sv;
}

模板的文件类型可以自己定义,模板文件必须在系统目录内,具体用法请参考章节(视图-标签)

导出cvs

导出svc只用组织文件内容就可以,如需要xls则需要用到poi类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
 * 指定数据导出csv文件并下载
 * @return
 */
public SrcView icsv() {
    //组织数据
    Map map = new HashMap();
    //组织头
    map.put("xls_head""no,name,age,sex");
    //组织数据在list中
    List ls = new ArrayList();
    ls.add("1,admin,39,man");
    ls.add("2,zhoujun,38,man");
    map.put("xls_body", ls);
     
    SrcView sv=new SrcView();
    sv.setType("csv");
    sv.setData(map);
    return sv;
}

日志输出

框架提供一个全局日志对象,系统中任何地方都能使用,并且系统已经为整个控制线做日志格式化输出和控制。
通过在配置文件中配置可以控制输出级别和范围。如需要自己写入日志范文,请使用Slog对象,下面是Slog对象方法表和使用示例。

返回方法参数
voidinfoString info输出带日期的info信息
voidinfoString info,boolean bs指定是否记录日志文件及输出带日期的info信息
如果是bs参数为true可以越过配置文件定义的日志范围
voiderrorString log警告形式打印及输出异常log信息
voidprintString log普通打印及输出异常log信息
voidprintString log,boolean bs指定是否记录日志文件及输出log信息
如果是bs参数为true可以越过配置文件定义的日志范围

示例

上面示例方法login中 框架日志功能自动记录输出了请求路径及时间、参数、接收处理类及方法、返回数据等情况,以及用Slog对象输出的字符。

请您对本章评分:
2016 - 2021 © srczh.com 版权所有 增值电信经营许可:粤ICP备19068081号
深圳市中文远星科技有限公司