1月30日——培训第59天

昨天的listSelectCourse.jsp:


<body>
 <form action="addCourseToStu.do" method="post">
 
  <logic:iterate id="course" name="allCourses">
  <c:set var="checked" value="" />
  <c:if test="${my:contains(user.courses,course)}">
  //这个my:contains(user.courses,course)是我们自定义的表达式函数,要求是公共且静态的
  //并且要在tld中去配置!
   <c:set var="checked" value="checked" />
  </c:if>

  //allCourses是上面请求作用域中的属性名
   <input type="checkbox" name="course" value="${course.id}" ${checked}/>${course.coursename}
   <br>
  </logic:iterate>
  <input type="submit" />
 </form>
</body>


也就是说又需要一个接收addCourseToStu.do的Action了。这个Action没有Form
<action path="/addCourseToStu" type="cn.itcast.struts.action.AddCourseToStuAction" />
public class AddCourseToStuAction extends Action
{
 public ActionForward execute()
 {
  String[] courseId = request.getParameterValues("course");
  Set courses = new HashSet() ;
  for(int i = 0 ; i < courseId.length ; i ++)
  {
   //根据主键创建cource,然后塞到课程集合里面
   Course c = new Course() ;
   c.setId(Integer.parseInt(courseId[i]));
   courses.add(c);
  }
  //得到复选框中选中的那些课程ID
  Student stu = (Student)request.getSession().getAttribute("user");
  //从session中取出学生
  //现在就是往数据关系表里面插入就可以了。

  stu.setCourses(courses) ; //把学生原来选的课程全部都删掉,
  //然后再加入那些新的课程就可以了。
  
  //下面该插入数据库了……
  SessionFactory factory = HibernateUtil.getSessionFactory(request);
  Session session = null ;

  try
  {
   session = factory.getCurrentSession() ;
   session.beginTransaction();
   
   session.update(stu); //更新对象!
   //先删掉关系表中所有的记录,然后再一条一条的插入关系!同时更新学生……
   session.getTransaction().commit() ;
  }
  catch(Exception ex)
  {
   if(session!=null&&session.getTransaction()!=null)
   {
    session.getTransaction().rollback();
   }
   ex.printStackTrace() ;
  }
  finally
  {
   session.close() ;
   session = null ;
  }
  return mapping.findForward("success") ;
 }
}


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

现在如果我们还要对课程进行增删改的话……

listCourseAction:(由listCourse.do地址可以到达它)

选出所有的课程并存入请求作用域:

public ActionForward execute()
{
 request.setAttribute("courses",getList(request,Course.class));
 return mapping.findForward("success");
}

public List getList(HttpServletRequest request ,Class clazz)
{
 SessionFactory factory = HibernateUtil.getSessionFactory(request) ;
 Session session = null ;

 List l = null ;
 
 try
 {
  session = factory.getCurrentSession() ;
  session.beginTransaction();
  Criteria c = session.createCriteria(clazz) ;
  l = c.list() ;
  session.getTransaction().commit();
 }
 catch(Exception e)
 {
  if(session!=null&&session.getTransaction()!=null)
  {
   session.getTransaction().rollback();
  }
  e.printStackTrace() ;
 }
 finally
 {
  if(session!=null)
  {
   session.close() ;
   session = null ;
  }
 }
 
 return l ;
}

这个Action选出所有的课程之后去listCourse.jsp页面:
<body>
 <a href="addCourse.jsp">增加</a>
 <table border="1">
  <logic:iterate id="course" name="courses">
   <tr>
    <td>${course.id}</td>
    <td>${course.coursename}</td>
    <td>${course.period}</td>
    <td><a href="modifyInput.do?id=${course.id}">修改</a>
    <a href="delete.do?id=${course.id}">删除</a></td>
   </tr>
  </logic:iterate>
 </table>
</body>


addCourse.jsp:(添加课程的名字、开课时间等)
要使用htmlform

<html:form action="/addCourseSubmit">
 课程名称:<html:text property="coursename"/><br>
 课程课时:<html:text property="period"/><br>
 <html:submit />
</html:form>

使用动态表单:name是courseForm,类型是DynaActionForm

肯定还需要一个Action,path是/addCourseSubmit
success设为/listCourse.do

public class AddCourseSubmitAction extends Action
{
 public ActionForward execute()
 {
  DynaActionForm courseForm = (DynaActionForm)form ;
  
  Course c = new Course() ;
  c.setCoursename(courseForm.get("coursename").toString());
  c.setPeriod(Integer.parseInt(courseForm.get("period").toString()));

  SessionFactory factory = HibernateUtil.getSessionFactory(request);
  Session session = factory.getCurrentSession() ;
  try
  {
   session.beginTransactin();
   session.save(c);
   session.getTransaction().commit() ;
  }
  catch()
  {}
  finally
  {}

  //save(request,Course.class,courseForm.getMap());

  return mapping.findForward("success");
 }

 //也可以封装成:
 public void save(HttpServletRequest request, Class clazz, Map map)
 {
  Object obj = null ;
  SessionFactory factory = HibernateUtil.getSessionFactory(request);
  Session session = null ;

  try
  {
   obj = clazz.newInstance() ;
   BeanUtils.populate(obj,map) ;//将map中的同名键设置obj中同名属性!

   session = factory.getCurrentSession() ;
   session.beginTransaction();
   session.save(obj);
   session.getTransaction().commit() ;
  }
 }
}


---------------------
为了解决乱码,必须重新实现ActionServlet的Process方法:
//必须在对请求里面的参数操作之前进行请求的转码,所以必须要在RequestProcessor
//处理之前去干这件事情!所以得重写ActionServlet的process方法!
//但是你也可以强行使用new String(str.getBytes("旧编码"),"新编码")的格式
//重新转码……
public class MyActionServlet extends ActionServlet
{
 protected void process(HttpServletRequest request,HttpServletResponse response)
 { 
  request.setCharacterEncoding("GBK");
  super.process(request,response) ;
 }
}

之后记得把web.xml中的ActionServlet的注册信息换成你自己重写的这个MyActionServlet!!

 


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

下午课程开始:

现在还剩下modifyInput.do和delete.do地址分别对应两个Action来处理修改和删除的
操作。
'
//成功后转到modify.jsp页面去,modify.jsp也要提交给一个Action,叫做
//modifySubmitAction,这两个Action都对应courseForm这个动态表单,
//modifySubmitAction修改后回到课程列表……

//利用ActionForm设置好默认值表单以供修改!
public class modifyInputAction extends Action
{
 public ActionForward execute()
 {
  DynaActionForm courseForm = (DynaActionForm)form ;
  SessionFactory factory = HibernateUtil.getSessionFactory(request) ;
  Session session = null ;

  //从超链接的get提交过来的参数id获取课程id
  String courseIdStr = request.getParameter("id") ;
  Integer courseId = null ;
  if(courseIdStr != null)
  {
   //转换为整形id
   courseId = new Integer(courseIdStr) ;
  }
  
  try
  {
   session = factory.getCurrentSession() ;
   session.beginTransaction() ;
   Course c = (Course)session.get(Course.class,courseId) ;
   //用整型对象非延迟加载一条课程的记录!

   courseForm.set("coursename",c.getCoursename());
   courseForm.set("id",new Integer(c.getId()));
   courseForm.set("period",new Integer(c.getPeriod()));
   //这样设置完毕后,courseForm会自动被存储进作用域里,不用手工存了。
   session.getTransaction().commit() ;
  }
  catch(HibernateException e)
  {
   if(session!=null&&session.getTransaction()!=null)
   {
    session.getTransaction().rollback() ;
   }
  }
  finally
  {
   if(session!=null)
    session.close() ;
  }

  return mapping.findForward("success");
 }
 
}


//下面考虑一下怎么样能够让修改这一功能也能够变得通用

protected void populateForm(HttpServletRequest request ,
      Class clazz, Serializable identifier,
      ActionForm form)

//Serializable identifier代表主键,之所以定义为Serializable,
//是因为hibernate的get方法或是load方法加载主键的时候本来就要求
//主键实现Serializable接口
{
 //现在ActionForm里面的属性不知道,你也不清楚是动态的form
 //还是静态的form……所以要判断一下!
  SessionFactory factory = HibernateUtil.getSessionFactory(request) ;
  Session session = null ;

  Map map = null ;
  
  try
  {
   session = factory.getCurrentSession() ;
   session.beginTransaction() ;
   Object obj = session.get(clazz,identifier);
   
   session.getTransaction().commit() ;
   map = BeanUtils.describe(obj) ;//不要写成左边的样子
   //这个describe方法是把obj中所有的属性都拿出来当字符串用了
   //这样一来,map中就都存储的是字符串的数值了。
   //应该写成下面这样子:
   map = new PropertyUtilsBean().describe(obj);
   //但是千万不要忘记describe会去找所有的getter方法,当然也包括那个
   //getClass,所以后面迭代的时候要去除它!
  }
  catch(HibernateException e)
  {
   if(session!=null&&session.getTransaction()!=null)
   {
    session.getTransaction().rollback() ;
   }
  }
  finally
  {
   if(session!=null)
    session.close() ;
  }

 

 if(form instanceof DynaActionForm)
 {
  DynaActionForm dform = (DynaActionForm)form ;
  Iterator it = map.entrySet().iterator() ;
  while(it.hasNext())
  {
   if("class".equals(entry.getKey().toString()))
   {
    continue ;
   }
   Map.Entry entry = (Map.Entry)it.next() ;
   dform.set(entry.getKey().toString(),entry.getValue()) ;
  }
  
 }
 else
 {
  try
  {
   BeanUtils.populate(form,map) ;
  }
  catch()
  {}
 }
}

//像上面那么封装之后,底下一句话就可以满足修改要求了!

populateForm(request,courseForm,Course.class, new Integer(request.getParameter(id)))

========================================================================

现在来看modifySubmitAction:

//进行数据库的修改……也就是把form表单对象中的值送到一个实体中:
//BeanUtils.populate(c,courseForm.getMap()) ;
//如果是静态表单的话,应该先用describe方法取出一个map,然后再populate
//就可以了。
public ActionForward execute()
{
 DynaActionForm courseForm = (DynaActionForm)form ;
 SessionFactory factory = HibernateUtil.getSessionFactory(request);
 Course c = new Course() ;
 c.setId(new Integer(courseForm.get("id").toString()).intValue());
 c.setCoursename(courseForm.get("coursename").toString()) ;
 c.setPeriod(new Integer(courseForm.get("period").toString()));
 //上面将页面中的表单值设置到实体中去。

 Session sessin = factory.getCurrentSession() ;
 session.beginTransaction();
 session.update(c);
 session.getTransaction().commit() ;

 return mapping.findForward("success");
}


最后还剩下一个delete,就比较简单了……
http://ardownload.adobe.com/pub/adobe/reader/win/8.x/8.0/chs/AdbeRdr80_zh_CN.exe 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值