Controller层的作用就是获取从页面传过来的值,调用service层进行业务处理,并把结果返回给页面。
controller可以可以处理业务逻辑呢?当然可以,代码想怎么写就怎么写。不过这是不建议的,逻辑处理还是要放在service层。更不允许直接调用dao操作数据库。
基础的controller包括以下方法:
1、进入页面
2、点击新增
3、执行新增
4、点击修改
5、执行修改
6、执行删除
这样就把一个简单的页面的功能都做出来了,剩下的就是完善丰富。
这里先介绍用户管理的例子,里面包含了分页、查询条件等功能,很具有代表性
SysUserController.java
@RequestMapping("/sys/user")
@Controller
public class SysUserController {
@Autowired
private SysUserService sysUserService;
@Autowired
private SysUserLoginService sysUserLoginService;
@Autowired
private SysRoleService sysRoleService;
@Autowired
private PubConfig pubConfig;
/**
* 进入用户管理界面
*
* @return
*/
@RequestMapping("/index")
public ModelAndView index(HttpServletRequest request, HttpServletResponse response, SysUserSearchVO sysUserSearchVO) {
ModelAndView mv = new ModelAndView();
int recordCount = sysUserService.count(sysUserSearchVO);// 获取查询总数
String url = createUrl(sysUserSearchVO);
PageNavigate pageNavigate = new PageNavigate(url, sysUserSearchVO.getPageIndex(), recordCount);//定义分页对象
List<SysUser> list = sysUserService.list(sysUserSearchVO);
mv.addObject("pageNavigate", pageNavigate);// 设置分页的变量
mv.addObject("list", list);// 把获取的记录放到mv里面
mv.addObject("listRole", sysRoleService.list());// 角色列表
mv.setViewName("/plat/sys/user/index");// 跳转至指定页面
BackUrlUtil.createBackUrl(mv, request, url);// 设置返回url
return mv;
}
// 设置分页url,一般有查询条件的才会用到
private String createUrl(SysUserSearchVO sysUserSearchVO) {
String url = pubConfig.getDynamicServer() + "/sys/user/index.htm?";
if (StringUtil.isNotNullOrEmpty(sysUserSearchVO.getUsername()))
url += "&username=" + sysUserSearchVO.getUsername();
if (StringUtil.isNotNullOrEmpty(sysUserSearchVO.getRealname()))//如果为模糊查询,要把该字段encode
url += "&realname=" + sysUserSearchVO.getRealname();
if (sysUserSearchVO.getStatus() != null)
url += "&status=" + sysUserSearchVO.getStatus();
if (sysUserSearchVO.getRoleId() != null)
url += "&roleId=" + sysUserSearchVO.getRoleId();
return url;
}
/**
* 进入添加用户界面
*
* @param request
* @param response
* @param
* @retursysUsern
*/
@RequestMapping("/toAdd")
public ModelAndView toAdd(HttpServletRequest request, HttpServletResponse response) {
ModelAndView mv = new ModelAndView();
mv.addObject("listRole", sysRoleService.list());// 角色列表
SysUser sysUser = new SysUser();
mv.addObject("sysUser", sysUser);
mv.setViewName("/plat/sys/user/add");
BackUrlUtil.setBackUrl(mv, request);// 设置返回的url
return mv;
}
/**
* 进入修改用户界面
*
* @param request
* @param response
* @param
* @return
*/
@RequestMapping("/toUpdate")
public ModelAndView toUpdate(HttpServletRequest request, HttpServletResponse response, int id) {
ModelAndView mv = new ModelAndView();
SysUser sysUser = sysUserService.get(id);
mv.addObject("sysUser", sysUser);
mv.addObject("listRole", sysRoleService.list());// 角色列表
mv.setViewName("/plat/sys/user/update");
BackUrlUtil.setBackUrl(mv, request);// 设置返回的url
return mv;
}
/**
* 新增用户
*
* @param request
* @param response
* @param sysUser
* @return
*/
@RequestMapping("/add")
public String add(HttpServletRequest request, HttpServletResponse response, SysUser sysUser) {
sysUser.setStatus(1);
int flag = sysUserService.add(sysUser);
if (flag == 0)
return "forward:/error.htm?msg=" + StringUtil.encodeUrl("用户信息新增失败");
else if (flag == 2)
return "forward:/error.htm?msg=" + StringUtil.encodeUrl("用户账号已存在");
else
return "forward:/success.htm?msg=" + StringUtil.encodeUrl("用户信息新增成功");
}
/**
* 修改用户
*
* @param request
* @param response
* @param sysUser
* @return
*/
@RequestMapping("/update")
public String update(HttpServletRequest request, HttpServletResponse response, SysUser sysUser) {
int flag = sysUserService.update(sysUser);
if (flag == 0)
return "forward:/error.htm?msg=" + StringUtil.encodeUrl("用户信息修改失败");
else
return "forward:/success.htm?msg=" + StringUtil.encodeUrl("用户信息修改成功");
}
/**
* 删除用户
*
* @param request
* @param response
* @param id
* @return
*/
@RequestMapping("/delete")
public String delete(HttpServletRequest request, HttpServletResponse response, int id) {
int flag = sysUserService.delete(id);
if (flag == 0)
return "forward:/error.htm?msg=" + StringUtil.encodeUrl("用户删除失败");
else
return "forward:/success.htm?msg=" + StringUtil.encodeUrl("用户删除成功");
}
/**
* 重置密码
*
* @param request
* @param response
*/
@RequestMapping("/saveResetPass")
public String saveResetPass(HttpServletRequest request, HttpServletResponse response, int id) {
int flag = sysUserService.saveResetPass(id);
if (flag == 0)
return "forward:/error.htm?msg=" + StringUtil.encodeUrl("用户重置密码失败");
else
return "forward:/success.htm?msg=" + StringUtil.encodeUrl("用户重置密码成功,重置后密码变为123456");
}
/**
* 用户加锁,状态由1变为0
*
* @param request
* @param response
* @param id
*/
@RequestMapping("/saveLock")
public String saveLock(HttpServletRequest request, HttpServletResponse response, int id) {
int flag = sysUserService.updateStatus(id, 2);
if (flag == 0)
return "forward:/error.htm?msg=" + StringUtil.encodeUrl("用户锁定失败");
else
return "forward:/success.htm?msg=" + StringUtil.encodeUrl("用户锁定成功");
}
/**
* 用户解锁,状态由2变为1
*
* @param request
* @param response
* @param id
*/
@RequestMapping("/saveUnlock")
public String saveUnlock(HttpServletRequest request, HttpServletResponse response, int id) {
int flag = sysUserService.updateStatus(id, 1);
if (flag == 0)
return "forward:/error.htm?msg=" + StringUtil.encodeUrl("用户解锁失败");
else
return "forward:/success.htm?msg=" + StringUtil.encodeUrl("用户解锁成功");
}
/**
* 验证用户代码是否存在
*
* @param request
* @param response
*/
@RequestMapping("/checkUserExist")
public void checkUserExist(HttpServletRequest request, HttpServletResponse response, String username) {
SysUser sysUser = sysUserService.getByUsername(username);
if (sysUser == null)
WebUtil.out(response, "true");
else
WebUtil.out(response, "false");
}
}
代码比较长,这里面主要说几个重要的地方
PubConfig.java 全局公共变量
学过Spring的都知道依赖注入DI的概念,但是怎么样注入一个类呢,即在配置文件里面定义了参数,在java代码里面怎么来调用呢?
首先在配置文件定义参数
这里在application.properties
里面加了六个参数
#config environment params
versionNo=1.1
imageServer=http://localhost:8080
imageUploadPath=D:\\upload
staticServer=http://localhost:8080
dynamicServer=http://localhost:8080
webTitle=Basic Development PlatForm
1、版本号,用于定义js和css的版本
2、图片服务器地址
3、图片上传路径
4、静态服务器地址
5、动态服务器地址
6、系统标题
这里先说一下图片服务地址和上传路径。一般分布式系统都有专门的文件上传服务,即当前的系统上传都调用专门的服务,上传至指定的文件存储路径,返回一个上传后生成的文件路径。这里图片上传路径可以随意指定,比如D:\upload,不要和web工程放到一起。图片服务器可以采用apache或nginx定义,指向上传路径,端口任意,相当于静态文件地址。
静态服务器地址指静态资源存储的地址,和图片服务器一样,单独剥离出来。
动态服务器地址毫无疑问指当前web应用的访问地址,也可以用域名来代替。
在系统开发中这三个地址可以是一个,部署时分离开即可。
在applicationContext.xml
中增加如下配置:
<!--设置公共参数 -->
<bean id="pubConfig" class="com.critc.plat.core.pub.PubConfig">
<property name="imageServer" value="${imageServer}"/>
<property name="imageUploadPath" value="${imageUploadPath}"/>
<property name="staticServer" value="${staticServer}"/>
<property name="dynamicServer" value="${dynamicServer}"/>
</bean>
在PubConfig.java
中如下设置:
/**
* 全局参数配置,用于在后端获取参数
*
* @author 孔垂云
* @date 2017-06-13
*/
@Component
public class PubConfig {
private String imageServer;//图片服务器地址
private String imageUploadPath;//图片路径
private String staticServer;//静态地址
private String dynamicServer;//动态地址
// set get省略
}
通过@Component
即把该类注入,在controller、service中就可以直接用了。
backUrl 返回页面url
页面返回值的应用场景是这样的:我按照用户名查询,查到数据后,点击修改,跳转至修改界面,点击修改,然后再调回我查询结果界面。很多系统遇到这种情况直接不处理,直接返回用户管理首页,这样用户体验是非常不好的,比如我一次查询到20条记录,每次修改都要重新查一次。
如果在easyUI或Ext页面中,这种情况是不存在的,原因就在于那两种是业务无刷新的,当前设计的框架是需要页面跳转的,所以跳转时就需要把当前页面的地址带过去,处理完再返回当前页面,所以就需要处理返回页面url
原理就是在点击修改或新增按钮时,把当前页面的url直接传过去,修改或新增页面增加一个隐藏域hidden,来保存这个返回的url,点击修改或保存后,再直接返回这个页面。
PageNavigate分页实现
系统实现分页的方式太多太多了,比如页面直接拼写分页脚本,利用js来生成分页代码,在服务端利用标签直接生成分页代码等等,不一而足。而且分页的方式也多种多样,显示上一页、下一页,显示数字分页等等。
本框架定义了PageNavigate
这个类来处理分页,把页面跳转url、当前页数、记录总数传进去就可以生成分页的html脚本。
网友评论