Search code examples
javaspringhibernatespring-mvchql

How to use Spring MVC to update current user data?


I'm beginner to learn spring MVC, Now I have a problem can't solve. I spent a lot of time want to use Spring MVC to update current user data,but always go round in circles.

For Example login user is [test2] and I want to update mAccount and mPassword,how to get login session and click jsp form to update.What should I do?(mId is Primary Key)

eclipse console message: enter image description here

eclipse debug mode message: enter image description here

Bean:

private Integer mId;
private String mAccount;
private String mPassword;
private String mName;
private Date mDate;
private String mPhone;
private String mAddress;
private String mGender;
private String mEmail;

MemberController:

    @Autowired
MemberService memberservice;

@Autowired
ServletContext context;

@RequestMapping(value = "/checklogin", method = RequestMethod.POST)
public String Login(HttpSession session, HttpServletRequest request) {
    MemberBean mb = null;
    Map<String, String> errorMsgMap = new HashMap<String, String>();
    session.setAttribute("errorMsgKey", errorMsgMap);
    String mAccount = request.getParameter("mAccount");
    String mPassword = request.getParameter("mPassword");

    try {
        mb = memberservice.checkPassword(mAccount, mPassword);
        if (mb != null) {
            session.setAttribute("LoginOK", mb);
        } else {
            errorMsgMap.put("LoginError", "帳號不存在或密碼錯誤");
        }
    } catch (RuntimeException e) {
        errorMsgMap.put("LoginError", e.getMessage());
    }

    if (errorMsgMap.isEmpty()) {

            } else {
        return "login/login";
    }
    return "index";
}

@RequestMapping(value = "/register/add", method = RequestMethod.GET)
public String getRegisterData(Model model) {
    MemberBean mb= new MemberBean();
    model.addAttribute("MemberBean",mb);
    return "register/register";
}

@RequestMapping(value = "/register/add", method = RequestMethod.POST)
public String porcessAddNewRegistertoForm(@ModelAttribute("MemberBean")MemberBean mb, BindingResult result) {
    memberservice.registerMember(mb);
    return "index";
}


@RequestMapping(value = "/UpdateMemberForm", method = RequestMethod.GET)
public String AddLoginMemberBeantoUpdateForm(Model model) {
    MemberBean mb = new MemberBean();
    model.addAttribute("MemberBean", mb);
    return "register/updateMember";
}
@RequestMapping(value = "/UpdateMemberForm", method = RequestMethod.POST)
public String UpdateMember(@ModelAttribute("MemberBean")MemberBean mb, BindingResult result ) {
    memberservice.updateMember(mb);
    return "index";
}

MemberDao:

public void setConnection(Connection conn);

public boolean checkAccount(String mAccount);

public int registerMember(MemberBean mb);

public MemberBean queryMember(String mAccount);

public MemberBean checkPassword(String mAccount, String mPassword);

public void updateMember(MemberBean mb);

MemberDaoImpl:

@Override
public boolean checkAccount(String mAccount) {
    boolean exist = false;
    String sql = "FROM MemberBean m WHERE m.mAccount=:mid";
    Session session = factory.getCurrentSession();
    try {
        MemberBean mb = (MemberBean) session.createQuery(sql).setParameter("mid", mAccount).uniqueResult();
        if (mb != null) {
            exist = true;
        }
    } catch (NoResultException ex) {
        exist = false;
    } catch (NonUniqueResultException ex) {
        exist = true;
    }
    return exist;
}

@Override
public int registerMember(MemberBean mb) {
    int n = 0;
    Session session = factory.getCurrentSession();
    session.save(mb);
    n++;
    return n;
}
@Override
public MemberBean queryMember(String mAccount) {
    MemberBean mb = null;
    Session session = factory.getCurrentSession();
    String sql = "FROM MemberBean m WHERE m.mAccount=:mid";
    try {
        mb = (MemberBean) session.createQuery(sql).setParameter("mid", mAccount).uniqueResult();
    } catch (NonUniqueResultException ex) {
        mb = null;
    }
    return mb;
}

@Override
public MemberBean checkPassword(String mAccount, String mPassword) {
    MemberBean mb = null;
    Session session = factory.getCurrentSession();
    String sql = "FROM MemberBean m WHERE m.mAccount=:mid and m.mPassword=:pswd";
    try {
        mb = (MemberBean) session.createQuery(sql).setParameter("mid", mAccount).setParameter("pswd", mPassword)
                .uniqueResult();
    } catch (NoResultException ex) {
        mb = null;
    }

    return mb;
}

@Override
public void updateMember(MemberBean mb) {

    String hql="UPDATE MemberBean mb SET mb.mAccount = :mAccount mb.mPassword = :mPassword WHERE mId = :mId";
    Session session = factory.getCurrentSession();

    session.createQuery(hql).setParameter("mAccount", mb.getmAccount()).setParameter("mPassword", mb.getmPassword())
            .setParameter("mId", mb.getmId()).executeUpdate();

}

}

MemberService:

boolean accountCheck(String mAccount);

int registerMember(MemberBean mb);

MemberBean queryMember(String mAccount);

public MemberBean checkPassword(String mAccount, String mPassword);

void updateMember(MemberBean mb );

MemberSeriveImpl:

@Transactional
@Override
public void updateMember(MemberBean mb) {
    if (mb.getmAccount() != null && mb.getmPassword() != null) {
        dao.updateMember(mb);
    }
}

updateMember.jsp:

    <form:form method="POST"  modelAttribute="MemberBean">
        <table>
            <tr>
                <td>帳號:</td>
                <td><form:input id="mAccount"  path="mAccount" type="text" value="${MemberBean.mAccount}"
                     size="10"/>
                </td>
            </tr>
            <tr>
                <td>密碼:</td>
                <td><form:input id="mPassword"  path="mPassword" type="text" value="${MemberBean.mPassword}"
                     size="10"/>
                </td>
            </tr>
            <tr>
                <td colspan="2" style="text-align: center"><input type="submit" value="更新"  > 
                </td>
            </tr>
        </table>
    </form:form>

Solution

  • This is syntax error due to space between = and : so change query to below by removing space.

    SET mb.mAccount =:mAccount mb.mPassword =:mPassword WHERE mId =:mId
    

    UPDATE :

    You are missing comma between mb.mAccount =: and mb.mPassword