这一节讲用户管理界面设计。先想想用户管理都要做什么,新增、修改、删除、查询用户基本信息,密码重置、加锁、解锁用户,查询用户登录记录,姑且这么多,如果还有额外的要求,后期都可以加进去。
1、新建公共引用taglib.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
页面开发中肯定要用到各种表达式语言,所以就用公共的jsp引进来,包括JSTL里面的C标签,ftm函数标签,还有Spring的form标签,后续还会用到自定义标签。
2、各页面的编写
这里面一共包括四个页面:
1、index.jsp,管理页面
2、add.jsp,新增页面
3、update.jsp,修改页面
4、login.jsp,用户的登录信息
都不是很复杂,下面主要讲特殊一点的知识点。
3、自定义函数式标签
开发中有些页面的引用可能用在好多地方,这时候就需要自定义一些函数式标签,常用的功能提前写好,用到的时候以标签的形式展示。比如用户管理界面用户状态字段,数据库存储的是1正常,2锁定,页面展示的时候就需要显示为汉字,更好看一些的话,正常是绿色,锁定是红色,加一些样式,这时候标签的好处就能体现出来了。
webtag.tld
在/webapp/WEB-INF/下面新建标签配置文件webtag.tld
1.0
critc
http://www.critc.com/jsp/jstl/tags
系统管理-用户管理获取用户状态
getUserStatus
com.critc.plat.util.web.WebTag
java.lang.String getUserStatus(java.lang.Integer)
这里面首先定义标签的版本号
,缩写名
,及URI
,这样在jsp页面里面就可以引用该标签了。
这里面定义了一个function
,里面四个配置项,
标签的描述,
函数名,
函数对应的类,需要写全路径,
函数签名,需要写清楚调用的是类里面的哪个方法,返回值是什么,这里面返回值和参数都需要时包装类型,不能是原生类型。
WebTag.java
public class WebTag {
/**
* 获取用户状态,系统管理-用户管理用到
*
* @param user_status
* @return
*/
public static String getUserStatus(Integer user_status) {
if (user_status == 1)
return "正常";
else if (user_status == 2)
return "已锁定";
else
return "";
}
}
taglib.jsp增加引用
<%@ taglib prefix="critc" uri="http://www.critc.com/jsp/jstl/tags"%>
index.jsp中的具体使用
${critc:getUserStatus(sysUser.status)}
很简单吧,而且可以重复使用。
4、SiteMesh中自定义Tag
实际开发中页面会有自定义的JS和CSS,这些JS和CSS需要按照格式要求放到指定位置,比如CSS放到header中,JS放到公共引用js的后面,这时候就需要自定义Tag了。
SiteMesh3.xml
增加这样两句话,自定义位置包括javascript和css
ScriptTagRuleBundle.java和CssTagRuleBundle.java
public class ScriptTagRuleBundle implements TagRuleBundle {
@Override
public void install(State defaultState, ContentProperty contentProperty, SiteMeshContext siteMeshContext) {
defaultState.addRule("critc-script",
new ExportTagToContentRule(siteMeshContext, contentProperty.getChild("critc-script"), false));
}
@Override
public void cleanUp(State defaultState, ContentProperty contentProperty, SiteMeshContext siteMeshContext) {
}
}
这一段的代码非常简单,实现TagRuleBundle
接口,增加一个Tag 规则即可,这里定义为critc-script
decorator.jsp
<%@include file="../common/scripts.jspf" %>
这里就和定位body和header一样,
这句话就可以页面定义的javascript放到最后。
index.jsp
这里就和普通javascript
定义一样,只不过在最外层包了一下
,原理一看就明白了。
5、自定义操作成功界面和失败界面
每个按钮操作成功后,比如新增、修改,需要告诉用户操作成功了,然后跳转回原先界面。一版这种场景有以下几种方式:
1、alert以下或页面上方、下方弹出一个tip,提示操作成功了,然后列表页面刷新一下,常用于页面无刷新的架构,比如easyUI、ext等
2、跳转至成功页面,提示操作成功,3秒后返回列表页面,常用于互联网界面。
这里选择第二种方式。
SysUserController.java
@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("用户信息新增成功");
}
操作成功或失败,跳往对应界面,同时把操作结果,以msg的形式带过去了。
更好的方式是以代码或数字码的方式传过去,在SccessController或ErrorController再解析这些代码具体对应的中文是什么。
SuccessController.java
@Controller
@RequestMapping("/")
public class SuccessController {
/**
* 成功处理操作
* @param request
* @param response
* @return
*/
@RequestMapping("/success")
public ModelAndView success(HttpServletRequest request, HttpServletResponse response) {
ModelAndView mv = new ModelAndView();
mv.setViewName("/plat/common/success");
mv.addObject("msg", StringUtil.decodeUrl(request.getParameter("msg")));
mv.addObject("backUrl", StringUtil.decodeUrl(request.getParameter("backUrl")));
return mv;
}
}
这一块代码很简单啊,就是获取msg
和backUrl
,并跳转success.jsp
界面
success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ include file="../common/taglib.jsp" %>
${webTitle }-操作成功