各位大哥,帮小弟检查错误,看下,哪里写的不规范,这些代码是要拿给经理看的,找出来,立马加分,现在先放100分,等下会加上400分,小弟的项目是 struts1.2 hibernate 2.0,前台jsp,oracle10G数据库,package com.comstars.ass.person.action;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;import net.sf.hibernate.Query;
import net.sf.hibernate.Session;
import net.sf.hibernate.Transaction;import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;import com.comstars.ass.person.form.TestForm;import com.comstars.hibernate.databean.TdAnswer;
import com.comstars.hibernate.databean.TdAssscaleRel;import com.comstars.hibernate.databean.AssScale;
import com.comstars.hibernate.databean.TdPersonanswer;
import com.comstars.hibernate.databean.TdPersonanswerPK;
import com.comstars.hibernate.databean.TdQuestion;
import com.comstars.hibernate.databean.TdTestInfo;import com.comstars.hibernate.util.DBHandle;
import com.comstars.struts.util.DateUtil;
import com.sun.org.apache.bcel.internal.generic.NEW;public class inputAnswerAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception { if (request.getParameter("org.apache.struts.taglib.html.TOKEN") != null) {
if (!isTokenValid(request)) {
return mapping.findForward("repeat"); // 重复提交
}
resetToken(request);
} else {
this.saveToken(request);// 保存一个Token到JSP
}
TestForm testForm = (TestForm) form;
int p = 0;// 判段跳转页面
Integer isquery = testForm.getCe();
// 获取testid
String testids = request.getParameter("testid");
System.out.println();
Integer testid = Integer.valueOf(testids.trim());
request.setAttribute("test", testid);
Session session = DBHandle.currentSession();
TdTestInfo testInfo = (TdTestInfo) session.load(TdTestInfo.class,
testid);
AssScale assScale = testInfo.getAssScale();
String logonsn = request.getParameter("logonsn");
request.setAttribute("logonsn", logonsn);

HttpSession session2=request.getSession();
 session2.setAttribute("LOGONSN",logonsn); 
     String nowTime = DateUtil.getStrNowTime();
Transaction tran = session.beginTransaction();
// 取得显示的题目和对应的答案
String hql2 = "select  a.questionid,b.answerid from TdQuestion a,TdAnswer b where a.assScale.scaleid=? and a.questionid=b.tdQuestion.questionid  order by a.sortnum,b.sortnum";
Query query2 = session.createQuery(hql2);
query2.setInteger(0, assScale.getScaleid().intValue());
Iterator it2 = query2.iterate();
HashMap<String, List> answerMap = new HashMap<String, List>();
List answerList = new ArrayList();
String strTmp = "";
while (it2.hasNext()) {
Object[] obj = (Object[]) it2.next();
HashMap map = new HashMap();
String questionid = obj[0].toString();
if (!strTmp.equals(questionid)) {
answerMap.put(strTmp, answerList);
answerList = new ArrayList();
map.put("answerid", obj[1]);
answerList.add(map);
strTmp = questionid;
} else {
map.put("answerid", obj[1].toString());
answerList.add(map);
}
}
answerMap.put(strTmp, answerList);
List keylist = new ArrayList();
Iterator it = answerMap.keySet().iterator();
while (it.hasNext()) {
String keyName = (String) it.next();
String aa = "";
if (!aa.equals(keyName)) {
keylist.add(keyName);
}
}
// 获得题目前数量
ArrayList count = new ArrayList();
for (int i = 0; i < keylist.size(); i++) {
count.add(i);
}
// 获得题目总数量
request.setAttribute("count2", count.size());
request.setAttribute("questArray", keylist);
request.setAttribute("questList", keylist);
request.setAttribute("uanme", assScale.getName());
try {
for (int i = 0; i < keylist.size(); i++) {
Integer answerId = null;
// 根据问题获取答案,并把答案放入 answers里面
List answers = new ArrayList();
List keyquestionid = answerMap.get(keylist.get(i).toString());
Iterator questionit = keyquestionid.iterator();
while (questionit.hasNext()) {
HashMap map = (HashMap) questionit.next();
answers.add(map.get("answerid"));
}
String strs = String.valueOf(i) + "_as";
String anser = request.getParameter(strs);
if (anser != null) {
if ((anser.equals("A")) || (anser.equals("a"))
|| (anser.equals("1"))) {
answerId = Integer.parseInt(answers.get(0).toString()); } else if ((anser.equals("B")) || (anser.equals("b"))
|| (anser.equals("2"))) {
answerId = Integer.parseInt(answers.get(1).toString());
} else if ((anser.equals("C")) || (anser.equals("c"))
|| (anser.equals("3"))) {
answerId = Integer.parseInt(answers.get(2).toString());
} else if ((anser.equals("D")) || (anser.equals("d"))
|| (anser.equals("4"))) {
answerId = Integer.parseInt(answers.get(3).toString());
} else if ((anser.equals("E")) || (anser.equals("e"))
|| (anser.equals("5"))) {
answerId = Integer.parseInt(answers.get(4).toString());
} else {
answerId = Integer.parseInt(answers.get(1).toString());
}
TdPersonanswerPK pk = new TdPersonanswerPK();
pk.setAnswerid(answerId);
pk.setLogonsn(logonsn);
TdPersonanswer personAnswer = new TdPersonanswer();
personAnswer.setComp_id(pk);
Integer quesind = Integer.parseInt(keylist.get(i)
.toString());
personAnswer.setQuestionid(quesind);
personAnswer.setCrttime(nowTime);
session.clear();
session.save(personAnswer);
session.flush();
p = 1;
}
}
// 更新state为2已经测评
            
String hqlTestInfo = " from TdTestInfo a where a.testid=?";
Query queryTestInfo = session.createQuery(hqlTestInfo);
queryTestInfo.setInteger(0, testid);
TdTestInfo tdTestInfo = (TdTestInfo) queryTestInfo.uniqueResult();
tdTestInfo.setState(2);
session.update(tdTestInfo);
tran.commit();
} catch (Exception e) {
tran.rollback();
e.printStackTrace();
return mapping.findForward("fail");
} finally {
DBHandle.closeSession();
}
if (1 == p) {
return mapping.findForward("questSuccess");
}
return mapping.findForward("inputanswerlist");
}
}

解决方案 »

  1.   

    代码长队来说
    是否一个方法代码太长了?
    -------------------------------------------
     String strs = String.valueOf(i) + "_as";
                    String anser = request.getParameter(strs);
                    if (anser != null) {
                        if ((anser.equals("A")) || (anser.equals("a"))
                                || (anser.equals("1"))) {
                            answerId = Integer.parseInt(answers.get(0).toString());                    } else if ((anser.equals("B")) || (anser.equals("b"))
                                || (anser.equals("2"))) {
                            answerId = Integer.parseInt(answers.get(1).toString());
                        } else if ((anser.equals("C")) || (anser.equals("c"))
                                || (anser.equals("3"))) {
                            answerId = Integer.parseInt(answers.get(2).toString());
                        } else if ((anser.equals("D")) || (anser.equals("d"))
                                || (anser.equals("4"))) {
                            answerId = Integer.parseInt(answers.get(3).toString());
                        } else if ((anser.equals("E")) || (anser.equals("e"))
                                || (anser.equals("5"))) {
                            answerId = Integer.parseInt(answers.get(4).toString());
                        } else {
                            answerId = Integer.parseInt(answers.get(1).toString());
                        }
    这里能否用switch来替代,让代码精简易懂
      

  2.   

    考虑mvc是否在这里实现了,感觉里面的代码相当臃肿
      

  3.   

    一、分层,数据与操作层分开
    二、各行对齐
    三、变量有意义一些
    四、注意效率,比如for (int i = 0; i < keylist.size(); i++) {
    中keylist.size()可考虑使用一变量存储。
    五、最主要的:多写注释,注释的内容要明确
    等等。
      

  4.   

    你用struts 就用MVC模式// 更新state为2已经测评
                            
                String hqlTestInfo = " from TdTestInfo a where a.testid=?";
                Query queryTestInfo = session.createQuery(hqlTestInfo);
                queryTestInfo.setInteger(0, testid);
                TdTestInfo tdTestInfo = (TdTestInfo) queryTestInfo.uniqueResult();
                tdTestInfo.setState(2);
                session.update(tdTestInfo);
                tran.commit();
     为啥还还把者 操作数据库的放在Action 这一层
    注意MVC
      

  5.   

    ((anser.equals("D")) || (anser.equals("d"))可以用equalsIgnoreCase
    一个方法最好不要超过一屏,可以按功能分解成几个方法
      

  6.   

    下面的就不看了   首先类名inputAnswerAction首字母就不应该小写的  汗~~
      

  7.   

    该说的 上面都说的差不多了 我作个小总结:
    1.注释不规范,缺少文档注释(/** 注释内容         */),文件的开头部分得有文档注释(head注释),主要说明本类的功能以及相关注意点。每个属性要加上文档注释 说明属性表示的现实意义、数据类型等,每个方法前要加文档注释 说明方法的主要功能、参数名称、参数类型、返回值、返回值类型以及本方法所要抛出的异常等等。2.命名不规范,比如类名的首字母要大写3.分层不规范,个人认为一个项目大致分为以下几个部分:(1)表示层,主要包含jsp与struts (2)model或者domain层,通常是一些java bean,hibernate里面常称为pojo对象 (3)DAO层,既通常所说的数据访问层 (4)业务逻辑服务层(service层),主要处理系统的业务逻辑
         以上各层次调用顺序为:jsp页面向服务器发送请求,系统将请求通过servlet转交给对应的struts类,在struts类的excute方法里面调用业务逻辑层的处理方法,业务逻辑层的处理方法调用DAO层的处理方法
         建议楼主如果能再添加上spring的话会更好     以上是我本人的个人看法,有不对的地方还望大家不吝指正!
      

  8.   

    再补充几点格式方面可以用eclipse自带的调整格式的功能String aa = "";
    if (!aa.equals(keyName)) {
        keylist.add(keyName);
    }
    变量名字最好要有意义,aa这个不妥。再说了,如果aa就是下面这个判断用到的话,为啥还要aa呢?request.setAttribute("uanme", assScale.getName());
    uanme是啥?uname?
      

  9.   

    我们经理说,我代码两分个方法,应该如何写呀,他说是,struts最基本的,
      

  10.   

    Struts框架中的Action的功能就是将请求与业务逻辑分开
      

  11.   

    import com.sun.org.apache.bcel.internal.generic.NEW;
    这是什么?好像没见代码中用过!!
      

  12.   

    送你一句话:基本功太差。        // 获得题目前数量
            ArrayList count = new ArrayList();
            for (int i = 0; i < keylist.size(); i++) {
                count.add(i);
            }
    if ((anser.equals("A")) || (anser.equals("a")) --》equalsIgnoreCase(String anotherString) 不看了!!你们经理要是没有工程化思想,你可以拿过去忽悠一下。
      

  13.   

    既然是考试,有多少题应该是已知的,这样的话试用数组效率高些,或者是
    new ArrayList(questionCount)之类的显示给个分配空间的初始值!!
    请教!!请教!!
      

  14.   

    大哥,我从一个jsp页面跳到action,取出为一些数据在页面上显示,然后,我提交到这个action,用于保存.我现在怎么样能把action里面保存代码,和显示代码,分别用两人个方法来说,弄好了,500分全给他
      

  15.   

    大哥,算了,小弟决定用DispatchAction,请问下大家,如何配置DispatchAction呀,我的xml 文件是这样的   
              <action path="/inputanswer" name="testForm"     scope="request" type="com.comstars.ass.person.action.inputAnswerAction" >
              
             
              <forward name="inputanswerlist" path="/WEB-INF/jsp/corp/assmanager/inputanswerlist.jsp"/>
               <forward name="questSuccess" path="/WEB-INF/jsp/person/questSuccess1.jsp"/>
               <forward name="fail" path="/WEB-INF/jsp/person/fail.jsp"/>
               <forward name="repeat" path="/WEB-INF/jsp/person/repeat.jsp"/>
              
              </action>       
               
      

  16.   


    配置action的对应关系,第一次显示对应show的method,第二次的保存对应save的method
      

  17.   

    就是用DispatchAction写不同的方法//显示
    public ActionForward show(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) {}
    //保存
    public ActionForward save(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) {}
      

  18.   

    刚才那个问题,我自已解决了,
    现在,我怎么在两个action里面共享数据,我先在query里面给answerMap和keylist赋值,的save里取值,应该怎么写呀,大哥,这是我的最后一个问题,答对了,500分全给你 
    public class inputAnswerAction extends DispatchAction {
            

              
    public ActionForward query(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) throws Exception
    {
       TestForm testForm = (TestForm) form;
    int p = 0;// 判段跳转页面
    Integer isquery = testForm.getCe();
    // 获取testid

    String testids = request.getParameter("testid");
    System.out.println();
    Integer testid = Integer.valueOf(testids.trim());
    request.setAttribute("test", testid);
    Session session = DBHandle.currentSession();
    TdTestInfo testInfo = (TdTestInfo) session.load(TdTestInfo.class,
    testid);
    AssScale assScale = testInfo.getAssScale();
    String logonsn = request.getParameter("logonsn");

    request.setAttribute("logonsn", logonsn); HttpSession session2 = request.getSession();
    session2.setAttribute("LOGONSN", logonsn);
          // 取得显示的题目和对应的答案
    String hql2 = "select  a.questionid,b.answerid from TdQuestion a,TdAnswer b where a.assScale.scaleid=? and a.questionid=b.tdQuestion.questionid  order by a.sortnum,b.sortnum";
    Query query2 = session.createQuery(hql2);
    query2.setInteger(0, assScale.getScaleid().intValue());
    Iterator it2 = query2.iterate();
    HashMap<String, List> answerMap = new HashMap<String, List>();
    List answerList = new ArrayList();
    String strTmp = "";
    while (it2.hasNext()) {
    Object[] obj = (Object[]) it2.next();
    HashMap map = new HashMap();
    String questionid = obj[0].toString();
    if (!strTmp.equals(questionid)) {
    answerMap.put(strTmp, answerList);
    answerList = new ArrayList();
    map.put("answerid", obj[1]);
    answerList.add(map);
    strTmp = questionid;
    } else {
    map.put("answerid", obj[1].toString());
    answerList.add(map);
    }
    }
    answerMap.put(strTmp, answerList);
    List keylist = new ArrayList();
    Iterator it = answerMap.keySet().iterator();
    while (it.hasNext()) {
    String keyName = (String) it.next();
    String aa = "";
    if (!aa.equals(keyName)) {
    keylist.add(keyName);
    }
    }
    // 获得题目前数量
    ArrayList count = new ArrayList();
    for (int i = 0; i < keylist.size(); i++) {
    count.add(i);
    }
    // 获得题目总数量
    request.setAttribute("count2", count.size());
    request.setAttribute("questArray", keylist);
    request.setAttribute("questList", keylist);
    request.setAttribute("uanme", assScale.getName());
    request.setAttribute("answerMap", answerMap);
    request.setAttribute("keylist", keylist);

      
    return mapping.findForward("inputanswerlist");


    }
          public ActionForward save(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) throws Exception
    {
     
    Session session = DBHandle.currentSession();
    String logonsn = request.getParameter("logonsn");
    String nowTime = DateUtil.getStrNowTime();
           System.out.println(logonsn+"========================================logonsn");
     
    List keylist = new ArrayList();
     for (int i = 0; i < keylist.size(); i++) {
    Integer answerId = null;
    // 根据问题获取答案,并把答案放入 answers里面
    List answers = new ArrayList();
    HashMap<String, List> answerMap = new HashMap<String, List>();
    List keyquestionid = answerMap.get(keylist.get(i).toString());
    Iterator questionit = keyquestionid.iterator();
    while (questionit.hasNext()) {
    HashMap map = (HashMap) questionit.next();
    answers.add(map.get("answerid"));
    }
    String strs = String.valueOf(i) + "_as";
    String anser = request.getParameter(strs);
    if (anser != null) {
    if ((anser.equals("A")) || (anser.equals("a"))
    || (anser.equals("1"))) {
    answerId = Integer.parseInt(answers.get(0).toString()); } else if ((anser.equals("B")) || (anser.equals("b"))
    || (anser.equals("2"))) {
    answerId = Integer.parseInt(answers.get(1).toString());
    } else if ((anser.equals("C")) || (anser.equals("c"))
    || (anser.equals("3"))) {
    answerId = Integer.parseInt(answers.get(2).toString());
    } else if ((anser.equals("D")) || (anser.equals("d"))
    || (anser.equals("4"))) {
    answerId = Integer.parseInt(answers.get(3).toString());
    } else if ((anser.equals("E")) || (anser.equals("e"))
    || (anser.equals("5"))) {
    answerId = Integer.parseInt(answers.get(4).toString());
    } else {
    answerId = Integer.parseInt(answers.get(1).toString());
    }
    TdPersonanswerPK pk = new TdPersonanswerPK();

    pk.setAnswerid(answerId);
    pk.setLogonsn(logonsn);
    TdPersonanswer personAnswer = new TdPersonanswer();
    personAnswer.setComp_id(pk);
    Integer quesind = Integer.parseInt(keylist.get(i)
    .toString());
    System.out.println(quesind+"========================================quesind");
    personAnswer.setQuestionid(quesind);
    personAnswer.setCrttime(nowTime);
    session.clear();
    session.save(personAnswer);
    session.flush();

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


      

  19.   

    如果你是写到一个Action里面可以用全局变量  如果是写到两个Action里面 可以用session 也可以把值放到request里面然后从页面在重新传回来接受。
      

  20.   

    if (1 == p) {
                return mapping.findForward("questSuccess");
            }
    1,0这种东西用常量表示
    比如:
    public final static int QuestSuccess=1;public final static String QuestSuccessPage="questSuccess";下面就是:if (QuestSuccess == p) {
                return mapping.findForward(QuestSuccessPage);
            }
    另外,不要写System.out,用logger注释用英文,显得你很牛,哈哈
      

  21.   

    List keylist = new ArrayList();
         for (int i = 0; i < keylist.size(); i++) {
                Integer answerId = null;
                // 根据问题获取答案,并把答案放入 answers里面
                List answers = new ArrayList();这段代码 keylist是新生成的 keylist.size()=0啊 下面那个循环永远也不会执行啊
    还有写循环可以这样写提高效率for (int i = 0,num=keylist.size(); i < num;  i++) {
      

  22.   

    加我[email protected] ,亲自教你