Struts2.16 form表单提交中文为空值 很纠结啊

jsp form表单代码如下。
[quote]




名称:



昵称:



密码:



性别:

女男人妖



生日:



备注:


                <label for=""></label>
                <input name="status" type="hidden" value="1" />
                <input name="button" type="submit" class="sbutton" id="button" value="提交"/>
                      &nbsp;
                      <input name="button2" type="reset" class="sbutton" id="button2" value="返回" />
                </form>
                 </div>     

[/quote]

Struts.xml的配置
[quote]
<?xml version="1.0" encoding="gbk" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<package name="default" namespace="/" extends="struts-default">
    <action name="*">
        <result>/WEB-INF/jsp/{1}.jsp</result>
    </action>

    <action name="UserInseAction" class="com.lcsz.classmates.action.UserInfoAction">
        <!--  result name="success" type="redirect">login</result-->
        <result name="success" type="redirect">login</result>
        <result name="input" type="redirect">UserIns</result>
    </action>
</package>

[/quote]

UserInfoAction.java 代码
[quote]
package com.lcsz.classmates.action;

import com.lcsz.classmates.dao.UserDao;
import com.lcsz.classmates.dao.impl.UserDaoImpl;
import com.lcsz.classmates.pojo.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class UserInfoAction extends ActionSupport implements ModelDriven {

/**
 * long
 */
private static final long serialVersionUID = 1L;
public User user = new User();

public String execute(){
    UserDao userdao = new UserDaoImpl();
    try {
        if (userdao.UserIns(user)) {

            return SUCCESS;
        } else {
            return INPUT;
        }
    } catch (Exception e) {
        System.out.println("发现错误:"+e.getMessage());
        return INPUT ;
    }
}

public User getModel() {

    return user;
}

}

[/quote]

在数据库中的插入记录 中文的话就是null 英文和数字可以插入进行
[b]问题补充:[/b]
[b]在Action中的值 如果是中文就是 null 如果不是中文就是就正常 :cry: [/b]
[b]问题补充:[/b]
[color=red]很郁闷的,
由于刚学Struts2 很多问题不知道是在哪产生的。

Struts.properties 中的设置如下

struts.enable.DynamicMethodInvocation = true
struts.devMode = true
struts.configuration.xml.reload =true
struts.i18n.encoding =GBK
struts.locale =zh_CN

在jsp页面中也设置 GBK [/color]

页面上的设置 和 XML上的设置 都是GBK了。
数据库也是GBK

[b]问题补充:[/b]
[color=blue]
if (userdao.UserIns([color=violet]user[/color])) {

return SUCCESS;
} else {
return INPUT;
}

[/color]
中文就为null
英文和数字就有值

[b]问题补充:[/b]

[color=darkred]问题其实已经决绝了。但是我觉得决绝的不够理想[/color]
[list]
[*]1.我在程序中加了个encoding Filter
[/list]
数据库 jsp页面 Struts.xml都设置了gbk
为什么还要写Filter呢。。

[color=red][b]大家回答下这个问题吧[/b][/color]

[b]问题补充:[/b]
其实页面不一定要用s标签的

用一般的 form input 一样可以等到的

首先你要明确一个概念: Action封装form的字段值有两中方法:

  1. 直接采用属性封装:

    Action中定义各个的属性要与对应form中的参数同名,
    并提供GET/SET方法;

  2. 采用模型对象封装:
    Action中只定义一个模型对象:[color=blue]public User user = new User(); [/color]并提供GET/SET方法;

    form中写法为:

我猜你本义是要采用第二中方法,所以应将jsp页面的form修改为:

[color=red][size=medium][align=center][/align][/size][/color]

debug一下看看,在action里面传中文的时候到底有没有值

你调试到execute方法里时,user里保存的中文是有的还是没有的,

先定位到底是前台没传过来,还是后台插不进去

1.debug 的 action 中字段是否有值.
2.如果有值,可以数据库转换编码有问题

你要写才行
你写input肯定是Null

if (userdao.UserIns([code="java"]user[/code]))
debug 这里看这个user 的相关字段是否有值.

很郁闷的,
由于刚学Struts2 很多问题不知道是在哪产生的。


对于你的问题,建议你先下个电子书看看,或买本书来研究再说,
看看网上的例子代码,再自己编写,学起来比较快

这里超多电子书的
http://www.51leifeng.net/search.php?searchid=107&orderby=lastpost&ascdesc=desc&searchsubmit=yes

if (userdao.UserIns([color=red]user[/color]))
debug 这里看这个user 的相关字段是否有值.


换成

的成

public User user = new User();

中是否有 setUsername 方法 是否是string 类型

设置request 的编码啊

[color=red]Struts.[/color]properties 文件名为小写字母啦

struts.properties

:) 增加了一个过滤器,是将页面的值经过action传递到后端,之间如果存在字符集编码不一致的情况下,将自动帮你转换。像楼主说的,应该不存在。还有一个不明白之处,你的action中定义了user对象,而页面使用的只是定义了一个属性如username,Action中是否要用private String username;来接收。

首先要思路清晰,确定是前台没有传过来值,还是有值而没有插入到数据库。再看是逻辑控制问题还是编码问题。

user.username

你要写getter/setter方法
getName/setName
并且在jsp标签的name="user.username"

很简单的就解决你的问题了,我只看了一行的代码

第一种 : 使用普通表单 后面一定要加 action 这是你这个程序接收部到值的原因
如果其他地方还有错误的话 哪我就部知道了 , 我就看了者一样就肯定你这个接收不到值的错误

第二种 : 使用struts2 的标签库的话,可以省略掉后缀action

第三种 : 是在有namespace 的时候 也必须要有action的后缀 否则无效

后面代码我没看 , 看了第一行就发现错误了 ,后面的代码太多了 看的头疼

那你在里面加过滤器看一下啊!!!!!
一般这样我想都是编码问题吧!

action="UserInseAction" 修改为action="UserInseAction.action"试试!

奇怪,我这里没问题:

example/chinesechar.jsp
[code]
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">


中文字符






/s:form



[code]

struts.xml
[code]
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<package name="example" namespace="/example" extends="struts-default">  
    <!-- 中文字符 -->
    <action name="chinese" class="example.ChineseCharAction">
        <result>/example/chinesechar.jsp</result>
    </action>

</package>


[/code]

example.ChineseCharAction
[code]
package example;

import org.apache.log4j.Logger;

public class ChineseCharAction extends ExampleSupport {

private static final long serialVersionUID = -990408847158885421L;

private static Logger log=Logger.getLogger(ChineseCharAction.class);

private String msg;

public String getMsg() {
    return msg;
}

public void setMsg(String msg) {
    this.msg = msg;
}

public String execute() throws Exception{
    if(log.isDebugEnabled()){
        log.debug(msg);
    }
    return SUCCESS;
}

}
[/code]

可以输出中文信息……
你jsp页面有没有这个
<%@ page contentType="text/html; charset=UTF-8" %>