周五!放假!
干劲涌上来了!
昨天的代码再重新贴一下:
FyTestService.java:
package 不.要.在.意.fyTest.service;
import java.util.List;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import 不.要.在.意.Page;
import 不.要.在.意.CrudService;
import 不.要.在.意.fyTest.dao.FyTestDao;
import 不.要.在.意.fyTest.entity.FyTestUser;
import 不.要.在.意.FunctionReturn;
@Service //对于 service层的类,在类上用 @Service注解声明
@Transactional(readOnly =false) //表示该类需要读写事务支持
//老规矩,不管crudService,写上只是防止以后会有其他相配合的功能要使用它
public class FyTestService extends CrudService<FyTestDao,FyTestUser> {
//获取page(查)
public Page<FyTestUser> getFyTestPage(Page<FyTestUser> page,FyTestUser fyTestUser){
fyTestUser.setPage(page);
page.setList(dao.getFyTestUserList(fyTestUser));
return page;
}
//fytest表单页面(增)
public FunctionReturn saveFyTestUser(FyTestUser fyTestUser){
FunctionReturn functionReturn = new FunctionReturn();
//保存fytest表单信息
dao.insertFyTestUser(fyTestUser);
functionReturn.setReturnCode(0);
functionReturn.setReturnMsg(fyTestUser.getName()+"["+fyTestUser.getTuid()+"]数据添加成功");
return functionReturn;
}
//导出表单数据(查)
public List<FyTestUser> getChannelMaintainUserExportList(FyTestUser fyTestUser){
return dao.getFyTestUserList(fyTestUser);
}
//移除表单数据 (删)
public FunctionReturn deleteFyTestUser(FyTestUser fyTestUser){
FunctionReturn functionReturn = new FunctionReturn();
dao.deleteFyTestUser(fyTestUser);
functionReturn.setReturnCode(0);
functionReturn.setReturnMsg("移除成功");
return functionReturn;
}
}
我去除了昨天"(存在问题)"的那两个注释
摆了,不纠结他们了,我现在就直接理解下这一整个类是干什么的就好了.
现在我已经能在里面看到查,增,删的功能了,现在我要自己写一个改的功能
接上文:
//改状态(改)
public FunctionReturn updateFyTestUserForStatus(FyTestUser fyTestUser){
FunctionReturn functionReturn=new FunctionReturn();
dao.updateFyTestUserForStatus(fyTestUser);
functionReturn.setReturnCode(0);
functionReturn.setReturnMsg("状态更改成功");
return functionReturn;
}
//改状态(改)
public FunctionReturn updateFyTestUserForAll(FyTestUser fyTestUser){
FunctionReturn functionReturn=new FunctionReturn();
dao.updateFyTestUserForAll(fyTestUser);
functionReturn.setReturnCode(0);
functionReturn.setReturnMsg("整体更改成功");
return functionReturn;
}
}
这两段写的相当快速,因为我没去细究各个地方的功能,对比一下就能发现,每块的写法大差不差,只需要改变一下"dao."那行对应的功能就好.
在我研究web层时,我用大佬昨天教我的理解代码的方式,debug运行一个他们写好的例子,给想看的地方打上断点,然后在程序中挨个功能都试一下,哪个操作触发了断点,那么断点所在的这段代码就对应这段操作.
用这个办法我很顺畅的理解了例子中的代码,并转化为我所用.
在web层的编写时我意识到我需要写一个验证工号是否有重复的功能,因为在设置数据表时我将工号设置为了主键.所以我又回去给dao层,service层都补上了这个功能
PS:这种之前我已经发过整篇代码的文件,要再进行新增时,我只发出新增的代码,在任务完成后我会再重新发一下所有的代码.
加入FyTestDao.java:
List<FyTestUser> getFyTestUserListForCheckTuid(FyTestUser fyTestUser); //在新增数据的前一刻使用,检查新建的数据的工号是否跟旧数据有重复
加入FyTestDao.xml:
<!-- 在新增数据的前一刻使用,检查新建的数据的工号是否跟旧数据有重复 -->
<select id="getFyTestUserListForCheckTuid" resultType="FyTestUser">
select
t.tuid as"tuid"
,t.name as"name"
,t.sex as"sex"
,t.dep as"departments"
,t.status as"status"
,t.tel as"telephone"
,t.create_time as"createTime"
,t.amend_time as"amendTime"
from fy_test t
where upper(t.tuid) = upper('#{tuid}') <!-- upper 所有小写字母转换为大写字母的大小写转换函数 -->
order by t.amend_time desc
</select>
更新FyTestService.java:
//fytest表单页面(增)
public FunctionReturn saveFyTestUser(FyTestUser fyTestUser){
FunctionReturn functionReturn = new FunctionReturn();
//1.设置数据表时将工号设计为了主键(不允许有重复数据),所以要将这种情况设置为"储存失败"
List<FyTestUser> checkList=dao.getFyTestUserListForCheckTuid(fyTestUser);
if(checkList.size()>0){ //checkList.size返回的数据是数据条数,当数据大于0时代表Dao层在数据库里查到了相同工号的数据
functionReturn.setReturnCode(1); //工号重复是不允许的,返回值"1",代表着错误
functionReturn.setReturnMsg("添加失败:表单中已存在该工号,请确认");
return functionReturn; //因为if成真,工号确实有重复,所以不进行保存操作,直接在此处return,2操作也就不会进行了
}
//2.保存fytest表单信息
dao.insertFyTestUser(fyTestUser);
functionReturn.setReturnCode(0);
functionReturn.setReturnMsg(fyTestUser.getName()+"["+fyTestUser.getTuid()+"]数据添加成功");
return functionReturn;
}
回到FyTestController.java:
package 不.要.在.意.fyTest.web;
import java.util.List;
import javax.servlet.http.HttpServletRequest; //HttpServletRequest接收来自客户端的请求
import javax.servlet.http.HttpServletResponse; //HttpServletResponse发出对客户端的响应
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; //它允许控制器向视图传递数据
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import 不.要.在.意.Page;
import 不.要.在.意.DateUtils;
import 不.要.在.意.Exceptions;
import 不.要.在.意.ExportExcel;
import 不.要.在.意.BaseController;
import 不.要.在.意.fyTest.entity.FyTestUser;
import 不.要.在.意.fyTest.service.FyTestService;
import 不.要.在.意.FunctionReturn;
/**
* FyTest
*
*/
@Controller
@RequestMapping(value="${adminPath}/fyTest")
public class FyTestController extends BaseController {
@Autowired
FyTestService fyTestService;
//调出页面1,查询整个数据表,分页,每页30行数据,展示
@RequiresPermissions("fyTest:fyTestUser:view") //注解,验证当前登录用户是否有 "fyTest:fyTestUser:view"对应的权限
@RequestMapping(value={"/fyTestUsers/list"}) //一个用来处理请求地址映射的注解,运行这个功能时的url路径就会是".../fyTestUsers/list"(还未验证)
public String fyTestUserList(FyTestUser fyTestUser,HttpServletRequest request,HttpServletResponse response,Model model){
Page<FyTestUser> page = fyTestService.getFyTestPage(new Page<FyTestUser>(request,response),fyTestUser);//获取了表的数据
model.addAttribute("page",page); //将数据存储在 Model对象中,然后在视图层中使用该数据
return"modules/fyTest/fyTest"; //疑问:返回了个字符串?干啥用的?
}
//调出页面2,填写"新增信息"的页面
@RequiresPermissions("fyTest:fyTestUser:edit")
@RequestMapping(value={"/fyTestUsers/form"})
public String fyTestUsersForm(FyTestUser fyTestUser, HttpServletRequest request, HttpServletResponse response, Model model){
return "modules/fyTest/fyTestForm";
}
//功能,新增信息
@RequiresPermissions("fyTest:fyTestUser:edit")
@RequestMapping(value={"/fyTestUsers/save"})
public String fyTestUsersSave(FyTestUser fyTestUser, Model model,RedirectAttributes redirectAttributes){
try{
FunctionReturn fr = fyTestService.saveFyTestUser(fyTestUser); //1查重2插入新数据
addMessage(redirectAttributes,fr.getReturnMsg()); //打印在Service层获取到的消息
}catch(Exception ex){
addMessage(redirectAttributes, fyTestUser.getName()+"["+fyTestUser.getTuid()+"]添加新数据失败");
logger.debug(Exceptions.getStackTraceAsString(ex));
ex.printStackTrace();
}
return"redirect:"+adminPath+"fyTest/fyTestUsers/list";
}
//导出表单数据
@RequiresPermissions("fyTest:fyTestUser:view")
@RequestMapping(value = "/fyTestUsers/export",method=RequestMethod.POST)
public String exportfile(FyTestUser fyTestUser,HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes){
try{
String fileName="FyTest"+DateUtils.getDate("yyyyMMDDHHmmss")+".xlsx";
List<FyTestUser>exportList= fyTestService.getFyTestUserExportList(fyTestUser);
new ExportExcel("fyTest", FyTestUser.class).setDataList(exportList).write(response, fileName).dispose(); return null;
}catch (Exception e){
addMessage(redirectAttributes,"导出信息失败!失败信息:"+e.getMessage());
}
return "redirect:"+adminPath+"/fyTest/fyTestUsers/list";
}
//删除数据
@RequiresPermissions("fyTest:fyTestUser:edit")
@RequestMapping(value = "/fyTestUsers/updateStatus")
public String fyTestUserUpdateStatus(FyTestUser fyTestUser, HttpServletRequest request, Model model, RedirectAttributes redirectAttributes){
try{
FunctionReturn fr = fyTestService.updateFyTestUserForStatus(fyTestUser);
addMessage(redirectAttributes,fr.getReturnMsg());
}catch(Exception ex){
addMessage(redirectAttributes,"状态更新失败");
logger.debug(Exceptions.getStackTraceAsString(ex));
ex.printStackTrace();
}
return "redirect:"+adminPath+"/fyTest/fyTestUsers/list";
}
//删除数据
@RequiresPermissions("fyTest:fyTestUser:edit")
@RequestMapping(value = "/fyTestUsers/updateAll")
public String fyTestUserUpdateAll(FyTestUser fyTestUser, HttpServletRequest request, Model model, RedirectAttributes redirectAttributes){
try{
FunctionReturn fr = fyTestService.updateFyTestUserForStatus(fyTestUser);
addMessage(redirectAttributes,fr.getReturnMsg());
}catch(Exception ex){
addMessage(redirectAttributes,"更新失败");
logger.debug(Exceptions.getStackTraceAsString(ex));
ex.printStackTrace();
}
return "redirect:"+adminPath+"/fyTest/fyTestUsers/list";
}
//删除数据
@RequiresPermissions("fyTest:fyTestUser:edit")
@RequestMapping(value = "/fyTestUsers/delete")
public String fyTestUserRemove(FyTestUser fyTestUser, HttpServletRequest request, Model model, RedirectAttributes redirectAttributes){
try{
FunctionReturn fr = fyTestService.deleteFyTestUser(fyTestUser);
addMessage(redirectAttributes,fr.getReturnMsg());
}catch(Exception ex){
addMessage(redirectAttributes,"删除失败");
logger.debug(Exceptions.getStackTraceAsString(ex));
ex.printStackTrace();
}
return "redirect:"+adminPath+"/fyTest/fyTestUsers/list";
}
}
1.try catch用法:
版权声明:本文为CSDN博主「呀吖呀吖呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yayayalaila/article/details/122723894
理论上,我们这里的try catch是捕获不到异常的,但是考虑到实际在程序运行中可能会发生意想不到的异常情况,所以我们都用上了.
但是真正的重点(以"功能"为例),重点就在
"FunctionReturn fr= fyTestService.saveFyTestUser(fyTestUser);"这一句上,而这一句包含的内容,就是我们从Dao,Service层一点点完善下来的.
至此,我们已经写完所有后端的内容啦(大概),接下来就是写前端的jsp页面文件,前端应该不会很麻烦,这个推进速度还是很不错的,周末就不用担心了.
下班.
整理与思考:
在FyTestController.java那里有一个“疑问”,我感觉是跟前端有关的,所以我打算先搁置,等下周写前端时看看能不能联系起来。
——20230317