雷神的SpringMVC-RestfulCRUD项目笔记整理1(员工列表和添加员工)

本文档详细介绍了如何使用SpringMVC构建一个符合REST风格的CRUD应用,包括查询所有员工、添加员工等功能。通过Controller、Model、JSP页面和表单标签的配合,实现了员工数据的增删改查,并展示了相关页面效果。
摘要由CSDN通过智能技术生成

利用SpringMVC做一个CRUD(增删改查)符合Rest风格的;

C:Create:创建

R:Retrieve:查询

U:Update:更新

D:Delete:删除

数据库:保存数据;

本项目使用Map,List保存数据之类

员工列表展示:

访问index.jsp----直接发送/emps------控制器查询所有员工------放在请求域中-----转发到list页面展示

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 访问项目就要展示员工列表页面 -->
<jsp:forward page="/emps"></jsp:forward>
 EmployeeController.java
@Controller
public class EmployeeController {

	@Autowired
	EmployeeDao employeeDao;

	@Autowired
	DepartmentDao departmentDao;

	/**
	 * 控制器处理请求:
	 * 1、查询所有员工
	 * 
	 * @return
	 */
	@RequestMapping("/emps")
	public String getEmps(Model model) {
		/*employeeDao.getAll()是查询所有员工。赋值给变量 all*/
		Collection<Employee> all = employeeDao.getAll();
		/*model.addAttribute();
		  往前台传数据,可以传对象,可以传List,通过el表达式 ${}可以获取到
          类似于request.setAttribute("sts",sts)效果一样。*/
		model.addAttribute("emps", all);
		return "list";/*要写list.jsp页面了*/
	}
	

list.jsp

	
	<h1>员工列表</h1>
	<%--表格边框和单元格设置 cellspacing单元格之间的间隔,挨着就设置为0--%>
	<table border="1" cellpadding="5" cellspacing="0">
		<%--表头那一行信息--%>
		<tr>
			<th>ID</th>
			<th>lastName</th>
			<th>email</th>
			<th>gender</th>
			<th>departmentName</th>
			<th>EDIT</th>
			<th>DELETE</th>
		</tr>
			<%--表格内信息:将emps里面的信息放进去 遍历用c标签 var指的是每一个员工--%>
		<c:forEach items="${emps }" var="emp">
			<%--表格内每一个员工对应的信息--%>
			<%--<td>是字体比<th>小--%>
			<tr>
				<td>${emp.id }</td>
				<td>${emp.lastName}</td>
				<td>${emp.email }</td>
				<td>${emp.gender==0?"女":"男" }</td>
				<td>${emp.department.departmentName }</td>
				<td><a href="${ctp }/emp/${emp.id }">edit</a></td>
				<td><a href="${ctp }/emp/${emp.id }" class="delBtn">delete</a></td>
			</tr>
		</c:forEach>
	</table>

效果展示

-----------------------------------------------------------------------

下面是添加员工页面

员工添加:

          在list页面点击“”员工添加“”----(查询出所有的部门信息要展示在页面)----来到添加页面(add.jsp)--------输入员工数据--------点击保存(/emp )------处理器收到员工保存请求(保存员工)--------保存完成以后还是来到list页面;

list.jsp页面

<%--list页面有一个超链接,点击之后转到添加员工页面  由于部门框不是写死的,而是下拉菜单(动态),所以在来到添加页面之前,得先获取所有的部门信息
	还是需要经过Controller--%>
	<a href="${ctp }/toaddpage">添加员工</a>

 EmployeeController.java

/**
	 * 去员工添加页面,去页面之前需要查出所有部门信息,进行展示的
	 * 
	 * @return
	 */
	@RequestMapping("/toaddpage")
	public String toAddPage(Model model) {
		// 1、先查出所有部门--departmentDao.getDepartments()赋值在变量departments
		Collection<Department> departments = departmentDao.getDepartments();
		// 2、放在请求域中
		model.addAttribute("depts", departments);
		
		// 3、去添加页面--add.jsp
		return "add";
	}

add.jsp

<html>
<body>
<h1>员工添加</h1>

<h1>员工添加</h1>
<form:form action="">
	<%--对应实体类Employee.java那里--%>
	lastName:<input type="text" name="lastName"/><br/>
	email:<input type="text" name="email"/><br/>
	gender:<br/>
	   男:<input type="radio" name="gender" value="1"/><br/>
	   女:<input type="radio" name="gender" value="0"/><br/>
	<%--如何将deptItem.id提交与实体类Employee.java产生联系,级联属性 <select name = department.id>--%>
	dept:<select name = department.id>
	<%--${depts}里面的depts是Controller中model.addAttribute("depts", departments);--%>
	       <c:forEach item="${depts}" var = "deptItem">
			   <%--对应实体类Department.java  value="${deptItem.id}"是提交的值,我们能看到的是>${deptItem.departmentName}--%>
			   <option value="${deptItem.id}">${deptItem.departmentName}</option>
		   </c:forEach>
	    </select>
	<input type="submit" value="提交"/>
</form:form>

</body>
</html>

效果

点击 添加员工

 

由于add.jsp 还可以用表单标签方法,更简便,所以两者对比一下

form:input里面的属性path就是原来html-input的name项:lastName:<input type="text" name="lastName"/>
   需要写path:
      1)、当做原生的name项
      2)、自动回显隐含模型中某个对象对应的这个属性的值

form:select里面

items="":指定要遍历的集合 ;自动遍历;遍历出的每一个元素是一个department对象
itemLabel="属性名":指定遍历出的这个对象的哪个属性是作为option标签体的值--能在页面展示的,看到的
itemValue="属性名":指定刚才遍历出来的这个对象的哪个属性是作为要提交 的value值
<form:form action="${ctp }/emp" modelAttribute="employee" method="POST">
	
	lastName:<form:input path="lastName"/><br/>
	email:<form:input path="email"/><br/>
	<%--form:radiobutton 单选按钮--%>
	gender:<br/>
		男:<form:radiobutton path="gender" value="1"/><br/>
		女:<form:radiobutton path="gender" value="0"/><br/>
	dept:
		
	    <%--下拉列表 不需要写forEach--%>
		<form:select path="department.id" 
			items="${depts }" 
			itemLabel="departmentName" 
			itemValue="id"></form:select><br/>
	<input type="submit" value="提交"/>
</form:form>


🆚对比传统的form表单提交方法


<h1>员工添加</h1>
<form:form action="">
lastName:<input type="text" name="lastName"/><br/>
email:<input type="text" name="email"/><br/>
gender:<br/>
男:<input type="radio" name="gender" value="1"/><br/>
女:<input type="radio" name="gender" value="0"/><br/>
	dept:<select name = department.id>
		<c:forEach item="${depts}" var = "deptItem">
			<option value="${deptItem.id}">${deptItem.departmentName}</option>
		</c:forEach>
	</select>
	<input type="submit" value="提交"/>
	</form:form>

但是会报错--请求域中没有一个command类型的对象;

解决方法:来到页面之前一定要给请求域中放这个对象;

在Controller里面给请求域中放这个对象

modelAttribute="":与之前学的无关,只是同名同姓而已
1)、以前我们表单标签会从请求域中获取一个command对象;把这个对象中的每一个属性对应的显示出来
2)、改名:把command改成其它名字
   可以告诉SpringMVC不要去取command的值了,我放了一个modelAttribute指定的值;
   取对象用的key就用我modelAttribute指定的--在add.jsp里面modelAttribute="employee"

EmployeeController.java

@Controller
public class EmployeeController {

	@Autowired
	EmployeeDao employeeDao;

	@Autowired
	DepartmentDao departmentDao;

	/**
	 * 控制器处理请求:
	 * 1、查询所有员工
	 * 
	 * @return
	 */
	@RequestMapping("/emps")
	public String getEmps(Model model) {
		
		Collection<Employee> all = employeeDao.getAll();
		
		model.addAttribute("emps", all);
       // model.addAttribute("command", newEmployee());//改名command--改成employee
        model.addAttribute("employee", newEmployee());
		return "list";
	}
	

效果也是同上面传统方法一样

 下面完成

输入员工数据--------点击保存(/emp )------处理器收到员工保存请求(保存员工)--------保存完成以后还是来到list页面

项目路径--request.getContextPath()赋值给ctp--哪个请求:/emp--哪个方法类型:method="POST" 完了之后去Controller写一个员工添加的所有方法addEmp()

add.jsp

<%
   pageContext.setAttribute("ctp", request.getContextPath());
%>
<form:form action="${ctp }/emp" modelAttribute="employee" method="POST">

EmployeeController.java

/**
	 * 保存员工
	 * 
	 * @param employee
	 * @return
	 */
	@RequestMapping(value = "/emp", method = RequestMethod.POST)
	public String addEmp(Employee employee) {
		System.out.println("要添加的员工:" + employee);
		//调用employeeDao的save()
		employeeDao.save(employee);
		//不返回list页面,因为还是要看/emps
		// 返回列表页面;重定向到查询所有员工的请求
		return "redirect:/emps";
	}

效果展示

 

这时候就保存成功了 

python023基于Python旅游景点推荐系统带vue前后端分离毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值