1、首先是Java基类控制器
package cn.edu.jxnu.base.controller;import java.io.IOException;
import java.util.Date;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.StringTrimmerEditor;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;import cn.edu.jxnu.base.common.DateEditor;/*** 主控制类* * @author 梦境迷离* @time 2018年4月10日 下午5:12:23.* @version V1.0*/
public class BaseController {private Logger log = LoggerFactory.getLogger(getClass());@Autowiredprotected HttpServletRequest request;@Autowiredprotected HttpServletResponse response;// 由@InitBinder表示的方法,可以对WebDataBinder对象进行初始化。WebDataBinder是DataBinder的子类,用于完成由表单到JavaBean属性的绑定。// @InitBinder方法不能有返回值,它必须名为void。// @InitBinder方法的参数通常是WebDataBinder,@InitBinder可以对WebDataBinder进行初始化。/*** 由InitBinder表示的方法,可以对WebDataBinder对象进行初始化。WebDataBinder是DataBinder的子类,* 用于完成由表单到JavaBean属性的绑定。 InitBinder方法不能有返回值,它必须名为void。* InitBinder方法的参数通常是WebDataBinder,@InitBinder可以对WebDataBinder进行初始化。* * @time 2018年4月10日 下午5:12:31.</br>* @version V1.0</br>* @param webDataBinder</br>*/@InitBinderprotected void initBinder(WebDataBinder webDataBinder) {/*** 一个用于trim 的 String类型的属性编辑器 如默认删除两边的空格,charsToDelete属性:可以设置为其他字符* emptyAsNull属性:将一个空字符串转化为null值的选项。*/webDataBinder.registerCustomEditor(String.class, new StringTrimmerEditor(true));webDataBinder.registerCustomEditor(Date.class, new DateEditor(true));}/*** 带参重定向** @param path* @return String*/protected String redirect(String path) {return "redirect:" + path;}/*** 不带参重定向** @param response* @param path* @return String*/protected String redirect(HttpServletResponse response, String path) {try {response.sendRedirect(path);} catch (IOException e) {e.printStackTrace();}return null;}/*** 获取分页请求 并排序* * @return PageRequest*/protected PageRequest getPageRequest() {int page = 1;int size = 10;Sort sort = null;try {String sortName = request.getParameter("sortName");String sortOrder = request.getParameter("sortOrder");if (StringUtils.isNoneBlank(sortName) && StringUtils.isNoneBlank(sortOrder)) {if (sortOrder.equalsIgnoreCase("desc")) {sort = new Sort(Direction.DESC, sortName);} else {sort = new Sort(Direction.ASC, sortName);}}page = Integer.parseInt(request.getParameter("pageNumber")) - 1;size = Integer.parseInt(request.getParameter("pageSize"));log.info("页数:" + page);log.info("容量:" + size);} catch (Exception e) {e.printStackTrace();}PageRequest pageRequest = new PageRequest(page, size, sort);return pageRequest;}/*** 获取分页请求 带排序* * @param sort* 排序条件* @return PageRequest*/protected PageRequest getPageRequest(Sort sort) {int page = 0;int size = 10;try {String sortName = request.getParameter("sortName");String sortOrder = request.getParameter("sortOrder");if (StringUtils.isNoneBlank(sortName) && StringUtils.isNoneBlank(sortOrder)) {if (sortOrder.equalsIgnoreCase("desc")) {sort.and(new Sort(Direction.DESC, sortName));} else {sort.and(new Sort(Direction.ASC, sortName));}}page = Integer.parseInt(request.getParameter("pageNumber")) - 1;size = Integer.parseInt(request.getParameter("pageSize"));} catch (Exception e) {e.printStackTrace();}PageRequest pageRequest = new PageRequest(page, size, sort);return pageRequest;}}
2、Java方式继承基类
package cn.edu.jxnu.base.controller.admin;import java.io.IOException;
import java.util.concurrent.TimeoutException;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;import cn.edu.jxnu.base.common.Constats;
import cn.edu.jxnu.base.common.JsonResult;
import cn.edu.jxnu.base.controller.BaseController;
import cn.edu.jxnu.base.entity.BorrowBook;
import cn.edu.jxnu.base.entity.User;
import cn.edu.jxnu.base.service.IBorrowBookService;
import cn.edu.jxnu.base.service.IUserService;
import cn.edu.jxnu.base.service.specification.SimpleSpecificationBuilder;
import cn.edu.jxnu.base.service.specification.SpecificationOperator.Operator;
import lombok.extern.slf4j.Slf4j;/*** 主页控制层,公共控制层,不需要权限* * @author 梦境迷离* @time 2018年4月10日 下午5:14:11.* @version V1.0*/
@Controller
@Slf4j
public class AdminIndexController extends BaseController {@Autowiredprivate IUserService userService;@Autowiredprivate IBorrowBookService borrowBookService;/*** 登陆* * @time 2018年4月10日 下午5:14:23.* @version V1.0* @return String*/@RequestMapping(value = { "/admin/", "/admin/index" })public String index() {log.info("登录界面");return "admin/index";}/*** 首页查询* * @time 2018年4月10日 下午5:14:38.* @version V1.0* @return String*/@RequestMapping(value = { "/admin/welcome" })public String welcome() {return "admin/welcome";}/*** 用户个人信息页面* * @time 2018年4月10日 下午5:15:22.* @version V1.0* @param map* @param response* @return String* @throws TimeoutException*/@RequestMapping(value = { "/admin/info" })public String info(ModelMap map, HttpServletResponse response, Integer id) throws TimeoutException {log.info("用户id:" + id);User u = (User) SecurityUtils.getSubject().getSession().getAttribute(Constats.CURRENTUSER + id);if (u != null) {/*** 没有过期*/map.put("user", u);} else {try {/*** 已经过期*/throw new TimeoutException("因超时无法获取您的个人信息,即将退出登录");} catch (Exception e) {map.put("message", e.getMessage());} finally {/*** 重定向到登录页面*/redirect(response, "/admin/login");}}return "admin/info";}/*** 用户已借阅书籍页面* * @time 2018年4月10日 下午5:15:43.* @version V1.0* @return String*/@RequestMapping(value = { "/admin/borrow" })public String borrow() {// 给页面传入必须的已借书籍return "admin/borrow";}/*** 注册,不能拦截* * @time 2018年4月10日 下午5:16:03.* @version V1.0* @param map* @return String*/@RequestMapping(value = { "/assets/regist" })public String regist(ModelMap map) {/*** 携带一个map,用于添加注册表单数据*/return "admin/regist/form";}/*** 登录页面的注册专用* * @time 2018年4月10日 下午5:16:27.* @version V1.0* @param user* @param map* @return JsonResult*/@RequestMapping(value = { "/assets/edit" }, method = RequestMethod.POST)@ResponseBodypublic JsonResult registAdd(User user, ModelMap map) {try {log.info("regist:" + user.toString());userService.saveOrUpdate(user);} catch (Exception e) {return JsonResult.failure(e.getMessage());}return JsonResult.success("注册成功,3秒后自动回到登录页面");}/*** 验证用户名【学号】是否已经被注册,委托给用户控制层* * @time 2018年4月10日 下午5:16:41.* @version V1.0* @param userCode* @param request* @param response* @throws ServletException* @throws IOException*/@RequestMapping(value = { "/assets/isAvailable" }, method = RequestMethod.GET)public void isAvailableUse(String userCode, HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {log.info("前台验证账户可用");request.getRequestDispatcher("/admin/user/isAvailable/" + userCode).forward(request, response);}/*** 所有人均可修改的个人信息* * @time 2018年4月10日 下午5:16:55.* @version V1.0* @param user* @param map* @return JsonResult* @throws ServletException* @throws IOException*/@ResponseBody@RequestMapping(value = { "/assets/update" }, method = RequestMethod.POST)public JsonResult allCanUpdate(User user, ModelMap map) throws ServletException, IOException {log.info("user:/assets/update:" + user.toString());try {User u = (User) SecurityUtils.getSubject().getSession().getAttribute(Constats.CURRENTUSER + user.getId());if (u == null) {// 已经过期try {throw new TimeoutException("因超时无法获取您的个人信息,即将退出登录");} catch (TimeoutException e) {map.put("message", e.getMessage());} finally {// 重定向到登录页面redirect(response, "/admin/logout");}}userService.saveOrUpdate(user);// 更新sessionSecurityUtils.getSubject().getSession().setAttribute(Constats.CURRENTUSER + user.getId(), user);} catch (Exception e) {return JsonResult.failure(e.getMessage());}return JsonResult.success();}/*** 查询用户已借阅的图书 每个人均可操作,不需要授权。超期不可自主归还* * @time 2018年4月10日 下午5:17:45.* @version V1.0* @param map* @param uCode* 操作人* @return Page 类型 BorrowBook*/@RequestMapping(value = { "/assets/borrowList" })@ResponseBodypublic Page<BorrowBook> borrowList(ModelMap map, @RequestParam(value = "uCode") String uCode) {User u = userService.findByUserCode(uCode);SimpleSpecificationBuilder<BorrowBook> builder = new SimpleSpecificationBuilder<BorrowBook>();String bookName = request.getParameter("inputBookName");String bookAuthor = request.getParameter("inputAuthor");String bookPress = request.getParameter("inputPublication");if (StringUtils.isNotBlank(bookName)) {builder.add("bookName", Operator.likeAll.name(), bookName);}if (StringUtils.isNotBlank(bookAuthor)) {builder.add("bookAuthor", Operator.likeAll.name(), bookAuthor);}if (StringUtils.isNotBlank(bookPress)) {builder.add("bookPress", Operator.likeAll.name(), bookPress);}User user = (User) SecurityUtils.getSubject().getSession().getAttribute(Constats.CURRENTUSER + u.getId());if (user.getId() != null) {builder.add("userId", Operator.eq.name(), user.getId());} else {// 已经过期try {throw new TimeoutException("因超时无法获取您的个人信息,即将退出登录");} catch (TimeoutException e) {map.put("message", e.getMessage());} finally {// 重定向到登录页面redirect(response, "/admin/logout");}}// 得到已借阅的书籍Page<BorrowBook> page = borrowBookService.findAll(builder.generateSpecification(), getPageRequest());return page;}}
3、Scala方式继承
package cn.edu.jxnu.base.controller.adminimport cn.edu.jxnu.base.controller.BaseController
import org.springframework.beans.factory.annotation.Autowired
import cn.edu.jxnu.base.service.IUserService
import cn.edu.jxnu.base.service.IBorrowBookService
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.ui.Model
import org.springframework.web.servlet.ModelAndView
import org.springframework.stereotype.Controller
import org.springframework.ui.ModelMap
import javax.servlet.http.HttpServletResponse
import lombok.extern.slf4j.Slf4j
import org.apache.shiro.SecurityUtils
import cn.edu.jxnu.base.common.Constats
import java.util.concurrent.TimeoutException
import cn.edu.jxnu.base.entity.User
import cn.edu.jxnu.base.common.JsonResult
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.ResponseBody
import org.springframework.web.bind.annotation.GetMapping
import javax.servlet.http.HttpServletRequest
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.data.domain.Page
import cn.edu.jxnu.base.entity.BorrowBook
import cn.edu.jxnu.base.service.specification.SimpleSpecificationBuilder
import org.apache.commons.lang3.StringUtils
import cn.edu.jxnu.base.service.specification.SpecificationOperator.Operator
import org.springframework.beans.factory.annotation.Required/*** @author 梦境迷离.* @time 2018年5月15日* @version v2.0*/
@Controller
class AdminIndexScala @Autowired() (val userService: IUserService, val borrowBookService: IBorrowBookService)extends BaseController {/*** 以下没有显示声明返回类型,所以默认返回最后的元素数据类型*///登陆@RequestMapping(value = { Array("/admin/", "/admin/index") })def index(model: Model) = {"admin/index"}//首页@RequestMapping(value = { Array("/admin/welcome") })def welcome() = {"admin/welcome"}//用户个人信息@RequestMapping(value = { Array("/admin/info") })def info(map: ModelMap, response: HttpServletResponse, @RequestParam(value = "id", required = false) id: Int) = {println("用户id:" + id)val u = SecurityUtils.getSubject().getSession().getAttribute(Constats.CURRENTUSER + id)if (u != null) {map.put("user", u)} else {try {throw new TimeoutException("因超时无法获取您的个人信息,即将退出登录")} catch {case e: Exception => map.put("message", e.getMessage())} finally {redirect(response, "/admin/login")}}"admin/info"}//书籍借阅页面@RequestMapping(value = { Array("/admin/borrow") })def borrow() = {"admin/borrow"}//注册,不能拦截@RequestMapping(value = { Array("/assets/regist") })def regist(map: ModelMap) = {"admin/regist/form"}//登录页面的注册专用@ResponseBody@PostMapping(value = { Array("/assets/edit") })def registAdd(user: User, map: ModelMap): JsonResult = {try {println("regist:" + user.toString())userService.saveOrUpdate(user)} catch {case e: Exception => return JsonResult.failure(e.getMessage())}return JsonResult.success("注册成功,3秒后自动回到登录页面")}//验证用户名【学号】是否已经被注册,委托给用户控制层@GetMapping(value = { Array("/assets/isAvailable") })def isAvailableUse(userCode: String, request: HttpServletRequest, response: HttpServletResponse) = {println("前台验证账户可用")request.getRequestDispatcher("/admin/user/isAvailable/" + userCode).forward(request, response)}//所有人均可修改的个人信息@ResponseBody@PostMapping(value = { Array("/assets/update") })def allCanUpdate(user: User, map: ModelMap): JsonResult = {println("user:/assets/update:" + user.toString())try {val u = SecurityUtils.getSubject().getSession().getAttribute(Constats.CURRENTUSER + user.getId())if (u == null) {// 已经过期try {throw new TimeoutException("因超时无法获取您的个人信息,即将退出登录")} catch {case e: TimeoutException => map.put("message", e.getMessage())} finally {// 重定向到登录页面Thread.sleep(1000)redirect(response, "/admin/logout")}}userService.saveOrUpdate(user)// 更新sessionSecurityUtils.getSubject().getSession().setAttribute(Constats.CURRENTUSER + user.getId(), user)} catch {case e: Exception => return JsonResult.failure(e.getMessage())}JsonResult.success("修改成功,下次登陆生效")}//查询用户已借阅的图书 每个人均可操作,不需要授权。超期不可自主归还@ResponseBody@RequestMapping(value = { Array("/assets/borrowList") })def borrowList(map: ModelMap, @RequestParam(value = "uCode") uCode: String): Page[BorrowBook] = {val u = userService.findByUserCode(uCode)val builder = new SimpleSpecificationBuilder[BorrowBook]()val bookName = request.getParameter("inputBookName")val bookAuthor = request.getParameter("inputAuthor")val bookPress = request.getParameter("inputPublication")if (StringUtils.isNotBlank(bookName)) {builder.add("bookName", Operator.likeAll.name(), bookName)}if (StringUtils.isNotBlank(bookAuthor)) {builder.add("bookAuthor", Operator.likeAll.name(), bookAuthor)}if (StringUtils.isNotBlank(bookPress)) {builder.add("bookPress", Operator.likeAll.name(), bookPress)}val user: User = SecurityUtils.getSubject().getSession().getAttribute(Constats.CURRENTUSER + u.getId()).asInstanceOf[User]if (user.getId() != null) {builder.add("userId", Operator.eq.name(), user.getId())} else {try {throw new TimeoutException("因超时无法获取您的个人信息,即将退出登录")} catch {case e: TimeoutException => map.put("message", e.getMessage())} finally {redirect(response, "/admin/logout")}}val page = borrowBookService.findAll(builder.generateSpecification(), getPageRequest())return page}
}
刚刚从Java转Scala需要注意的点还是很多的,总结目前遇到的
1、采用主构造注入SpringBean,bean定义val【常量】
2、继承与实现均使用extends【实际没有实现一说,接口可以使用with继承多个,叫混合更符合】
3、类等等允许有构造方法,甚至值类型也可以有一个参数的构造,构造参数一旦被使用,就自动升格为类的字段/属性
4、Scala默认public,private比Java更严格,不许嵌套类的父类访问嵌套类
5、def定义方法/过程,无返回值叫Unit是可以省略的,同时=也可以省略,叫过程
6、return与分号可以省略
7、集合默认是不可变集合
8、异常使用模式匹配 case
9、泛型使用 [] 而不是<>
10、Scala中一切操作均函数,甚至是 ++ +=这种,这++不是i++这种的,Scala是不存在++i 、i++、 --i、 i--
11、Scala没有基本类型,对数值可以进行方法调用,如+= 常见的 & %
Scala = 2.11.8