论坛首页 Java版 Struts

关于struts+hibernate+oracle8i乱码的问题请教

浏览 1642 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2004-09-29
我用strtus+hibernate+oracle8i做一个小例子,一个表3个字段。
[code:1]create table SYSUSER  (
   USERID               VARCHAR(32)                         not null,
   USERNAME             VARCHAR2(20),
   USERPASSWORD         VARCHAR2(20),
   LASTLOGIN            DATE,
   constraint PK_SYSUSER primary key (USERID)
)[[/code:1]
实现添加删除更新的操作。现在添加删除都没有问题。更新的时候出现了乱码。我用了“国际化资源文件”写了一个filter,代码如下。[code:1]
package com.DBStruts.util;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class SetEncodeFilter implements Filter {

protected FilterConfig filterConfig = null;

protected String defaultencoding = null;

public void init(FilterConfig arg0) throws ServletException {
this.filterConfig = arg0;
//获取系统缺省[code]语言编码[/code]
this.defaultencoding = filterConfig.getInitParameter("defaultencoding");
}

public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
arg0.setCharacterEncoding(selectEncoding(arg0));
arg2.doFilter(arg0,arg1);
}
public void destroy() {
this.defaultencoding = null;
this.filterConfig = null;
}

protected String selectEncoding(ServletRequest request){
return this.defaultencoding;
}
}
[/code:1]
关于更新的代码如下SysuserAction.java:
[code:1]//Created by MyEclipse Struts
// XSL source (default): platform:/plugin/com.genuitec.eclipse.cross.easystruts.eclipse_3.7.200/xslt/JavaClass.xsl

package com.yourcompany.struts.action;

import java.util.Iterator;
import java.util.Locale;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.hibernate.HibernateException;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.util.MessageResources;

import com.DBStruts.demo.SysuserMap;
import com.DBStruts.demo.SysuserQueryMap;
import com.yourcompany.struts.form.SysuserForm;

/**
* MyEclipse Struts
* Creation date: 09-26-2004
*
* XDoclet definition:
* @struts:action path="/sysuser" name="sysuserForm" input="/sysuser/editsysuser.jsp" scope="request" validate="true"
* @struts:action-forward name="/sysuser/editsysuser" path="/sysuser/editsysuser"
*/
public class SysuserAction extends Action {

// --------------------------------------------------------- Instance Variables

// --------------------------------------------------------- Methods

/**
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)throws Exception {
/**初始化系统语言资源*/
Locale local = getLocale(request);
MessageResources messages = getResources(request);
//用户请求时所指明的请求类型
String action = request.getParameter("act");
//获取到处理表单的内容formbean
SysuserForm sysuser = (SysuserForm)form;

//判断处理请求并进行相应的处理
if(action == null || action.equals("list")){
SysuserQueryMap sqm = new SysuserQueryMap();
Iterator sysuserlist = sqm.findAllSysuser();
//将用户列表压入了bean中
request.setAttribute("sysuserlist",sysuserlist);
action = "list";
}else if(action.equals("create")){
//如果请求类型为create
request.setAttribute("sysuserForm",new SysuserForm());
action = "create";
}else if(action.equals("add")){
//如果处理请求类型为add
SysuserMap sysusermap = new SysuserMap();
try{
sysusermap.createSysuser(sysuser);
//加入成功,我们在接着加入下一个用户
request.setAttribute("sysuserForm",new SysuserForm());
action = "create";
}catch(HibernateException e){
//存入数据库出错
ActionErrors errors = new ActionErrors();
errors.add(
ActionErrors.GLOBAL_ERROR,
new ActionError("error.database.save",e.toString())
);
this.saveErrors(request,errors);
//将当前数据回显,并显示用户重新输入
request.setAttribute("sysuserForm",sysuser);
action = "create";
}
}else if(action.equals("edit")){
//请求类型为edit
SysuserQueryMap sqm = new SysuserQueryMap();
String uid = request.getParameter("userid");
//从数据库中取得这个用户的信息,然后将这个用户信息压入FormBean中
request.setAttribute("sysuserForm",sqm.getSysuserByID(uid));
}else if(action.equals("update")){
//请求类型为update
System.out.println("sysuser.getUserid1::::::::::" + sysuser.getUserid());
System.out.println("sysuser.getUsername1::::::::::" + sysuser.getUsername());
//sysuser.setUsername(new String(sysuser.getUsername().getBytes(),"8859_1"));
SysuserMap sysusermap = new SysuserMap();
sysusermap.updateSysuser(sysuser);
SysuserQueryMap sqm = new SysuserQueryMap();
Iterator sysuserlist = sqm.findAllSysuser();
//将用户列表压入了bean中
request.setAttribute("sysuserlist",sysuserlist);
action = "list";
}else if(action.equals("delete")){
//如果处理请求为delete
SysuserMap sysusermap = new SysuserMap();
String uid = request.getParameter("userid");
try{
sysusermap.deleteSysuser(uid);
SysuserQueryMap sqm = new SysuserQueryMap();
Iterator sysuserlist = sqm.findAllSysuser();
//将用户列表压入了bean中
request.setAttribute("sysuserlist",sysuserlist);
}catch(HibernateException e){
ActionErrors errors = new ActionErrors();
//如果出错就压一个错误到全局的错误中
errors.add(
ActionErrors.GLOBAL_ERROR,
new ActionError("error.database.delete",e.toString())
);
this.saveErrors(request,(ActionErrors) response);
}
action = "list";
}

//从定义中获取View路径,并转发至View
return mapping.findForward(action);
}
}[/code:1]
SysuserMap.java 代码
[code:1]package com.DBStruts.demo;

import java.util.Calendar;

import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;

import com.DBStruts.dao.AbsBaseMap;
import com.DBStruts.db.Sysuser;
import com.yourcompany.struts.form.SysuserForm;

/**
* @author Administrator
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class SysuserMap extends AbsBaseMap {
/**
* 增加一条记录,在VO层,我们使用的数据类型为SysuserForm,所以增加
* 的参数一定是SysuserForm
* @param sysuserForm
* @throws HibernateException
*/
public void createSysuser(SysuserForm sysuserForm)throws HibernateException{
//使用 sysuserForm的相关属性新建sysuser实例
Sysuser sysuser = new Sysuser(
sysuserForm.getUsername(),
sysuserForm.getUserpassword(),
Calendar.getInstance()
);
//启动事务
Session session = this.beginTransaction();
try{
//新增这个实例到数据库
session.save(sysuser);
//commit
this.endTransaction(true);
}catch(HibernateException e){
//rollback
this.endTransaction(false);
throw e;
}
}

/**
* 更新一个sysuser
* @param sysuserForm 包含更新内容的sysuser form bean
* @throws HibernateException
*/
public void updateSysuser(SysuserForm sysuserForm)throws HibernateException{
/**使用sysuserForm的相关属性新建sysuser实例*/
Sysuser sysuser = new Sysuser(
sysuserForm.getUserid(),
sysuserForm.getUsername(),
sysuserForm.getUserpassword(),
Calendar.getInstance()
);
//sysuser.setUserid(sysuserForm.getUserid());
System.out.println("sysuser.getUserid2::::::::::" + sysuser.getUserid());
System.out.println("sysuser.getUsername2::::::::::" + sysuser.getUsername());
System.out.println("sysuserForm.getUsername2:::::::::" + sysuserForm.getUsername());
System.out.println("userpassword::::::::::" + sysuser.getUserpassword());
/**启动事务*/
Session session = this.beginTransaction();
try{
session.clear();
//更新这个实例到数据库中
session.update(sysuser);
//commit
this.endTransaction(true);
}catch(HibernateException e){
//rollback
this.endTransaction(false);
throw e;
}
}

/**
* 删除一般都会是使用用户ID来删除,所以参数可以是带有用户ID的formbean或是用户ID
* @param sysuserForm 带有用户ID的formbean
* @throws HibernateException
*/
public void deleteSysuser(SysuserForm sysuserForm)throws HibernateException{
String userid = sysuserForm.getUserid();
/**该方法下面定义*/
this.deleteSysuser(userid);
}

/**
* 根据用户ID来删除用户
* @param userid 用户ID
* @throws HibernateException
*/
public void deleteSysuser(String userid)throws HibernateException{
Session session = this.beginTransaction();
try{
//先向数据库中查询是否有这个用户
Sysuser sysuser = (Sysuser)session.load(Sysuser.class,userid);
//删除它
session.delete(sysuser);
this.endTransaction(true);
}catch(HibernateException e){
this.endTransaction(false);
}
}
}
[/code:1]

我贴张控制板打印的内容, 虽然打印的内容都没有乱码,但数据库中更新的记录的username字段是乱码,别的字段没有乱码。显示在界面的也是乱码。
-----------------------------------
哪位朋友知道怎么解决阿?能帮帮我么?

如果我没说清楚,欢迎加我qq: 327278581
   
最后更新时间:2004-09-29
我换成mysql的数据库,(只是用mysql建立了个表)改了hibernate.config.xml文件结果添加删除都没问题。再更新的时候,反映出来的效果是,页面长时间不进行跳转,myeclipse界面发生变化,如我的抓图所示,这时候发现数据库数据已经改变,如果是汉字则乱码,英文则更改完成。

------------------------------------------
难道没人帮帮我么?
   
0 请登录后投票
最后更新时间:2004-09-30
你用Mysql的时候在连接字符串后面加上

[code:1]
jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=gb2312
[/code:1]

了吗,就是encoding
   
0 请登录后投票
最后更新时间:2004-09-30
慕容姐姐 写道
我换成mysql的数据库,(只是用mysql建立了个表)改了hibernate.config.xml文件结果添加删除都没问题。再更新的时候,反映出来的效果是,页面长时间不进行跳转,myeclipse界面发生变化,如我的抓图所示,这时候发现数据库数据已经改变,如果是汉字则乱码,英文则更改完成。

------------------------------------------
难道没人帮帮我么?


这张图不就是调试模式么,点击 java perspective view就可以转换回去,至于乱码,换个oracle驱动试试看  ,出了classes12好像有个ojdbc14.jar可以用。
   
0 请登录后投票
最后更新时间:2004-09-30
十因为更新的方法不对,应该这样写,[code:1] public void updateSysuser(SysuserForm sysuserForm)throws HibernateException{
/**使用sysuserForm的相关属性新建sysuser实例*/

/**启动事务*/
Session session = this.beginTransaction();
try{
//session.clear();

Sysuser sysuser = (Sysuser)session.load(Sysuser.class,sysuserForm.getUserid());
sysuser.setUsername(sysuserForm.getUsername());
sysuser.setUserpassword(sysuserForm.getUserpassword());
session.update(sysuser);
//commit
this.endTransaction(true);
}catch(HibernateException e){
//rollback
this.endTransaction(false);
throw e;
}

}
[/code:1]

谢谢楼上2位朋友了。         看错了,是1位朋友2次回答我
   
0 请登录后投票
论坛首页 Java版 Struts

跳转论坛:
JavaEye推荐