实现一组功能的步骤:javascript
|
|
|
|
|
|
3,填空: css
多对多中的<many-to-many column="..">:通常能够写为关联对象的名称加Id后缀。 html
将几个JavaBean都写好后,再一块儿将其映射文件写好大半,至于关联关系能够先写完注释,拷模板,将name和class属性填好,将column属性留至最后对照来写. java
column属性:先从最简单的多对一关系开始写(只有一行),再写其对应的一对多… jquery
例如如下User,Role和Department: spring
User:数据库
public class User {服务器 private Long id;网络 private Department department;session private Set<Role> roles = new HashSet<Role>(); //用户与角色多对多
private String loginName; // 登陆名 private String password; // 密码 private String name; // 真实姓名 private String gender; // 性别 private String phoneNumber; // 电话号码 private String email; // 电子邮件 private String description; // 说明 ……… } |
Role:
public class Role { private Long id; private String name; private String description;
private Set<User> users = new HashSet<User>(); //岗位和用户多对多关系 ……. } |
Department:
public class Department { private Long id; private String name; private String description;
private Set<User> users = new HashSet<User>(); //部门和用户一对多 private Set<Department> children= new HashSet<Department>(); //部门和下级部门一对多 private Department parent; //部门和上级部门多对一 …… } |
User.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.itcast.oa.domain"> <class name="User" table="itcast_user"> <id name="id"> <generator class="native"></generator> </id>
<property name="loginName" column="loginName"></property> <property name="password" column="password"></property> <property name="name" column="name"></property> <property name="gender" column="gender"></property> <property name="phoneNumber" column="phoneNumber"></property> <property name="email" column="email"></property> <property name="description" column="description"></property>
<!-- department属性,表达的是本对象与Department的多对一关系 --> <many-to-one name="department" class="Department" column="departmentId"></many-to-one>
<!-- roles属性,表达的是本对象与Role的多对多关系 --> <set name="roles" table="itcast_user_role"> <key column="userId"></key> <many-to-many class="Role" column="roleId"></many-to-many> </set>
</class> </hibernate-mapping> |
Role.hbm.xml:
<!-- users属性,表达的是本对象与User的多对多关系 --> <set name="users" table="itcast_user_role"> <key column="roleId"></key> <many-to-many class="User" column="userId"></many-to-many> </set> |
Department.hbm.xml:
<!-- users属性,表达的是本对象与User的一对多关系 --> <set name="users"> <key column="departmentId"></key> <one-to-many class="User"/> </set>
<!-- children属性,表达的是本对象与Department(下级)的一对多 --> <set name="children"> <key column="parentId"></key> <one-to-many class="Department"/> </set>
<!-- parent属性,表达的是本对象与Department(上级)的多对一关系 --> <many-to-one name="parent" class="Department" column="parentId"></many-to-one> |
运行TestSpring中testSessionFactory方法,测试成功则建表完毕.
TestSpring:
package cn.itcast.oa.test;
import org.hibernate.SessionFactory; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSpring {
private ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//测试SessionFactory @Test public void testSessionFactory() throws Exception{ SessionFactory sf = (SessionFactory) ac.getBean("sessionFactory"); System.out.println(sf.openSession()); }
//测试事务管理 @Test public void testTx() throws Exception{ TestService testService = (TestService) ac.getBean("testService"); testService.saveTwoUsers(); }
//测试Action对象的管理 @Test public void testAction() throws Exception{ TestAction testAction = (TestAction) ac.getBean("testAction"); System.out.println(testAction); } } |
按照美工给的静态页面进行分析.再写action以前,先设计好方法名等(最好带有规律).
<result name="toList" type="redirectAction">/xxxAction_list</result> |
6)转发只有一次请求,重定向包含两次请求.
4,实现功能:
不要忘记在Action类上加注解 @Controller 和 @Scope("prototype").如:
DepartmentAction:
package cn.itcast.oa.view.action; import javax.annotation.Resource; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import cn.itcast.oa.domain.Department; import cn.itcast.oa.service.DepartmentService; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven;
@Controller @Scope("prototype") public class DepartmentAction extends ActionSupport implements ModelDriven<Department>{
private Department model = new Department(); public Department getModel() { return model; } /* @Resource private DepartmentService departmentService;*/
/** * 列表 */ public String list() throws Exception { return "list"; } /** * 删除 */ public String delete() throws Exception { return "toList"; } /** * 添加页面 */ public String addUI() throws Exception { return "saveUI"; } /** * 添加 */ public String add() throws Exception { return "toList"; } /** * 修改页面 */ public String editUI() throws Exception { return "saveUI"; } /** * 修改 */ public String edit() throws Exception { return "toList"; } } |
TIP:增删改查所用的6个Action方法模板:
/** 列表 */ public String list() throws Exception { return "list"; } /** 删除 */ public String delete() throws Exception { return "toList"; } /** 添加页面 */ public String addUI() throws Exception { return "saveUI"; } /** 添加 */ public String add() throws Exception { return "toList"; } /** 修改页面 */ public String editUI() throws Exception { return "saveUI"; } /** 修改 */ public String edit() throws Exception { return "toList"; } |
2, 初步建立JSP页面(页面上只写些简单东西,用于测试), 并配置struts.xml.如:
List.jsp:
SaveUI.jsp:
struts.xml:
<!-- 部门管理 --> <action name="department_*" class="departmentAction" method="{1}"> <result name="list">/WEB-INF/jsp/departmentAction/list.jsp</result> <result name="saveUI">/WEB-INF/jsp/departmentAction/saveUI.jsp</result> <result name="toList" type="redirectAction">department_list</result> </action> |
Tips:class=" departmentAction"首字母是小写, redirectAction要拼写正确,jsp要放进WEB-INFO目录下.
测试:启动服务器,访问action,观察页面是否成功跳转.
在Action中注入相应Service(加上注解@Resource).
先利用Ctrl+1建立action要用到的Service接口(和其中的规范(Ctrl+1,再Alt+向左键 返回原来的类)),等写完了action中的具体方法,再建立具体的ServiceImpl类,实现其中具体的功能.
在ServiceImpl类上加上注解@Service@Transactional,在ServiceImpl中注入相应Dao(加上注解@Resource).
记得在实现类上加注解@Repository.
先完成基本功能:把数据显示出来,不用管样式.完成基本功能的时候,要参照静态页面来完成,好比页面列表上有添加和修改选项,因此就得完成这些功能.等到测试运行没问题以后再套用静态页面:即将美工给的静态页面源码和相关的资源文件(如等)拷过来.再仔细修改静态页面.如:
(部门管理有关上级部门的功能暂不实现(涉及树状结构))
列表页面:
添加/修改页面(区别是修改页面有回显数据):
原始代码:
List.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <%-- 显示数据 --%> <html> <body>
<s:iterator value="departmentList"> <s:property value="id"/>, <s:property value="name"/>, <s:property value="description"/>
<%-- 使用s:a标签,能够帮咱们自动的加上前面的工程名称和后面的扩展名 --%> <s:a action="department_delete?id=%{id}" onclick="return confirm('肯定要删除吗?')">删除</s:a> <s:a action="department_editUI?id=%{id}">修改</s:a> <br/> </s:iterator>
<s:a action="department_addUI">添加</s:a>
</body> </html> |
迭代器的这种写法是被容许的,不过departmentList要事先被put进集合域中.相应action中的代码:
/** * 列表 */ public String list() throws Exception { List<Department> departmentList = departmentService.findAll(); ActionContext.getContext().put("departmentList", departmentList); return "list"; } |
SaveUI.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <body>
<s:form action="department_%{id == null ? 'save' : 'edit'}"> <s:hidden name="id"></s:hidden> 名称:<s:textfield name="name"></s:textfield><br/> 说明:<s:textarea name="description"></s:textarea><br/> <s:submit value="提交"></s:submit> </s:form>
</body> </html> |
若id有值(id是从List.jsp传过来的),则这个表单会提交到DepartmentAction中的edit()方法,这个页面就成了修改页面.
而此时这个修改页面回显数据的功能就成了关键(用Struts2标签回显数据很方便,缺点是要本身修改样式):
<s:textfield name="name"></s:textfield>隐藏了value="name"(不写也会有,因此用Struts2标签回显数据很方便).
他会先从值栈的栈顶开始找对象的name属性,若找不到就会从map域的key值开始找.因此若是想要更好地回显数据,最好就要先把数据push进值栈栈顶.
对应DepartmentAction中的代码:
/** * 修改页面 */ public String editUI() throws Exception { //准备回显的数据 Department department = departmentService.getById(model.getId()); ActionContext.getContext().getValueStack().push(department); return "saveUI"; } |
套用静态页面,即将页面源码复制过来后,修改页面代码.
在此要先将..替换成${pageContext.request.contextPath},而后再将
<script language="javascript" src="../script/DemoData.js" charset="utf-8"></script>
<script language="javascript" src="../script/DataShowManager.js" charset="utf-8"></script>
删掉(这些是测试数据),将class改为cssClass(Struts2标签中,会将cssClass翻译成class)最后再慢慢修改...
list.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <html> <head> <title>部门列表</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script language="javascript" src="${pageContext.request.contextPath}/script/jquery.js"></script> <script language="javascript" src="${pageContext.request.contextPath}/script/pageCommon.js" charset="utf-8"></script> <script language="javascript" src="${pageContext.request.contextPath}/script/PageUtils.js" charset="utf-8"></script> <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/style/blue/pageCommon.css" /> <script type="text/javascript"> </script> </head> <body>
<div id="Title_bar"> <div id="Title_bar_Head"> <div id="Title_Head"></div> <div id="Title"><!--页面标题--> <img border="0" width="13" height="13" src="${pageContext.request.contextPath}/style/images/title_arrow.gif"/>部门管理 </div> <div id="Title_End"></div> </div> </div>
<div id="MainArea"> <table cellspacing="0" cellpadding="0" class="TableStyle">
<!-- 表头--> <thead> <tr align=center valign=middle id=TableTitle> <td width="150px">部门名称</td> <td width="150px">上级部门名称</td> <td width="200px">职能说明</td> <td>相关操做</td> </tr> </thead>
<!--显示数据列表--> <s:iterator value="departmentList"> <tbody id="TableData" class="dataContainer" datakey="departmentList"> <tr class="TableDetail1 template"> <td><s:property value="name"/> </td> <td> </td> <td><s:property value="description"/> </td> <td><s:a action="department_delete?id=%{id}" onclick="return confirm('肯定要删除么?')">删除</s:a> <s:a action="department_editUI?id=%{id}">修改</s:a><br/> </td> </tr> </tbody> </s:iterator> </table>
<!-- 其余功能超连接 --> <div id="TableTail"> <div id="TableTail_inside"> <s:a action="department_addUI"><img src="${pageContext.request.contextPath}/style/images/createNew.png" /></s:a> </div> </div> </div> <!--说明--> <div id="Description"> 说明:<br /> 1,列表页面只显示一层的(同级的)部门数据,默认显示最顶级的部门列表。<br /> 2,点击部门名称,能够查看此部门相应的下级部门列表。<br /> 3,删除部门时,同时删除此部门的全部下级部门。 </div> </body> </html> |
saveUI.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <head> <title>部门设置</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script language="javascript" src="${pageContext.request.contextPath}/script/jquery.js"></script> <script language="javascript" src="${pageContext.request.contextPath}/script/pageCommon.js" charset="utf-8"></script> <script language="javascript" src="${pageContext.request.contextPath}/script/PageUtils.js" charset="utf-8"></script> <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/style/blue/pageCommon.css" /> </head> <body>
<!-- 标题显示 --> <div id="Title_bar"> <div id="Title_bar_Head"> <div id="Title_Head"></div> <div id="Title"><!--页面标题--> <img border="0" width="13" height="13" src="${pageContext.request.contextPath}/style/images/title_arrow.gif"/>部门信息 </div> <div id="Title_End"></div> </div> </div>
<!--显示表单内容--> <div id=MainArea> <s:form action="department_%{id == null ? 'save' : 'edit'}"> <s:hidden name="id"></s:hidden> <div class="ItemBlock_Title1"><!-- 信息说明<DIV CLASS="ItemBlock_Title1"> <IMG BORDER="0" WIDTH="4" HEIGHT="7" SRC="${pageContext.request.contextPath}/style/blue/images/item_point.gif" /> 部门信息 </DIV> --> </div>
<!-- 表单内容显示 --> <div class="ItemBlockBorder"> <div class="ItemBlock"> <table cellpadding="0" cellspacing="0" class="mainForm"> <tr><td width="100">上级部门</td> <td><select name="parentId" class="SelectStyle"> <option value="0" selected="selected">请选择部门</option> <option value="7">┠总经理室</option> <option value="1">┠市场部</option> <option value="2"> ┠咨询部</option> <option value="3"> ┠招生部</option> <option value="4">┠教学部</option> <option value="5">┠后勤部</option> </select> </td> </tr> <tr><td>部门名称</td> <td><s:textfield name="name" cssClass="InputStyle"/> *</td> </tr> <tr><td>职能说明</td> <td><s:textarea name="description" cssClass="TextareaStyle"/></td> </tr> </table> </div> </div>
<!-- 表单操做 --> <div id="InputDetailBar"> <input type="image" src="${pageContext.request.contextPath}/style/images/save.png"/> <a href="javascript:history.go(-1);"><img src="${pageContext.request.contextPath}/style/images/goBack.png"/></a> </div> </s:form> </div> <div class="Description"> 说明:<br /> 1,上级部门的列表是有层次结构的(树形)。<br/> 2,若是是修改:上级部门列表中不能显示当前修改的部门及其子孙部门。由于不能选择自已或自已的子部门做为上级部门。<br /> </div> </body> </html> |
DepartmentAction:
package cn.itcast.oa.view.action; import java.util.List; import javax.annotation.Resource; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import cn.itcast.oa.domain.Department; import cn.itcast.oa.service.DepartmentService; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven;
@Controller @Scope("prototype") public class DepartmentAction extends ActionSupport implements ModelDriven<Department>{
private Department model = new Department(); public Department getModel() { return model; }
@Resource private DepartmentService departmentService;
/** * 列表 */ public String list() throws Exception { List<Department> departmentList = departmentService.findAll(); ActionContext.getContext().put("departmentList", departmentList); return "list"; } /** * 删除 */ public String delete() throws Exception { departmentService.delete(model.getId()); return "toList"; } /** * 添加页面 */ public String addUI() throws Exception { return "saveUI"; } /** * 添加 */ public String save() throws Exception { departmentService.save(model); return "toList"; } /** * 修改页面 */ public String editUI() throws Exception { //准备回显的数据 Department department = departmentService.getById(model.getId()); ActionContext.getContext().getValueStack().push(department); return "saveUI"; } /** * 修改 */ public String edit() throws Exception { //获取要修改的数据库中的原始数据 Department department = departmentService.getById(model.getId()); //修改 department.setName(model.getName()); department.setDescription(model.getDescription()); //修改数据库中的数据 departmentService.update(department); return "toList"; } } |
经常使用快捷键:
Alt + 方向键向左键 跳回刚刚打开的类
Alt + Shift + A 集体编辑?
Ctr + o 按一次,显示当前类包含的的全部字段,方法等, 再按一次会附加显示继承过来的全部字段,方法等.
Ctrl + Shift +x 转成大写(先选中)
Alt + / 代码提示
Shift + Enter 至关于先按End在按回车,即在当前行下面另起一个新行。
Ctrl + Shift + F 格式化代码
Ctrl + Shift + O 自动导入包
Ctrl + / 注释/取消注释
Ctrl + Shift + T 打开类或接口的文件
Ctrl + D 删除整行
Ctrl + 1 快速修复错误
Alt + ↑ 当前行的代码移动到上面去
Alt + ↓ 当前行的代码移动到下面去
Ctrl + Alt + ↓ 复制当前行到下面
Ctrl + F11 直接运行
F11 Debug模式运行
Ctrl + Shift + X 转为大写
Ctrl + Shift + Y 转为小写