表单代码:
<s:if test="goodss!=null">
<s:iterator value="goodss">
<s:form action="shopcar.action" method="post">
<tr>
<td height="98"><img src="photos/<s:property value="%{goodsimag}"/>"
width="113" height="98" alt="" /></td>
<td><s:property value="goodsname"/></td>
<td><s:property value="goodsprice"/></td>
<td><s:property value="num"/></td>
<td><label>
<s:textfield size="6" name="num" value="1"></s:textfield>
</label></td>
<td><label>
<s:hidden name="goodsid" value="goodsid"></s:hidden>
<!-- <s:submit name="buygoods" value="立即购买" method="buygoods"></s:submit>-->
<s:submit value="放入购物车"></s:submit>
</label></td>
</tr>
</s:form>
</s:iterator>
</s:if>struts.xml <action name="shopcar" class="shopcarAction" method="savegoodsincar">
<result name="success">/tip.jsp</result>
<result name="input">/tip.jsp</result>
</action>
调用的action:@Controller
@Scope("prototype")
public class ShopcarAction extends ActionSupport {
@Resource GoodsDAO goodsdaoimpl;
@Resource OrdersDAO ordersdaoimpl;
private Integer goodsid;
private Integer num;
private String tip;
public String getTip() {
return tip;
} public void setTip(String tip) {
this.tip = tip;
} public Integer getGoodsid() {
return goodsid;
} public void setGoodsid(Integer goodsid) {
this.goodsid = goodsid;
} public Integer getNum() {
return num;
} public void setNum(Integer num) {
this.num = num;
}
public String savegoodsincar(){
System.out.println("0000000");
Goods goods=goodsdaoimpl.findById(goodsid);
if(goods.getNum()>num)
{
Buycar buycar=(Buycar)ActionContext.getContext().getSession().get("buycar");
if(buycar==null)
{
buycar=new Buycar();
ActionContext.getContext().getSession().put("buycar", buycar);
}
buycar.additem(new Buyitem(goods,num));
setTip("添加到购物车成功!");
// ActionContext.getContext().getSession().put("buycar", buycar);
return SUCCESS;
}else
{
setTip("您所购买的数量超过库存数量!");
return INPUT;
}
}
提交表单后 总是直接返回tip页面,没有调用action中定义的方法。
因为后台都没打印System.out.println("0000000");这句话;同学们,帮帮忙。。看看哪里有问题????????谢谢了。。
<s:if test="goodss!=null">
<s:iterator value="goodss">
<s:form action="shopcar.action" method="post">
<tr>
<td height="98"><img src="photos/<s:property value="%{goodsimag}"/>"
width="113" height="98" alt="" /></td>
<td><s:property value="goodsname"/></td>
<td><s:property value="goodsprice"/></td>
<td><s:property value="num"/></td>
<td><label>
<s:textfield size="6" name="num" value="1"></s:textfield>
</label></td>
<td><label>
<s:hidden name="goodsid" value="goodsid"></s:hidden>
<!-- <s:submit name="buygoods" value="立即购买" method="buygoods"></s:submit>-->
<s:submit value="放入购物车"></s:submit>
</label></td>
</tr>
</s:form>
</s:iterator>
</s:if>struts.xml <action name="shopcar" class="shopcarAction" method="savegoodsincar">
<result name="success">/tip.jsp</result>
<result name="input">/tip.jsp</result>
</action>
调用的action:@Controller
@Scope("prototype")
public class ShopcarAction extends ActionSupport {
@Resource GoodsDAO goodsdaoimpl;
@Resource OrdersDAO ordersdaoimpl;
private Integer goodsid;
private Integer num;
private String tip;
public String getTip() {
return tip;
} public void setTip(String tip) {
this.tip = tip;
} public Integer getGoodsid() {
return goodsid;
} public void setGoodsid(Integer goodsid) {
this.goodsid = goodsid;
} public Integer getNum() {
return num;
} public void setNum(Integer num) {
this.num = num;
}
public String savegoodsincar(){
System.out.println("0000000");
Goods goods=goodsdaoimpl.findById(goodsid);
if(goods.getNum()>num)
{
Buycar buycar=(Buycar)ActionContext.getContext().getSession().get("buycar");
if(buycar==null)
{
buycar=new Buycar();
ActionContext.getContext().getSession().put("buycar", buycar);
}
buycar.additem(new Buyitem(goods,num));
setTip("添加到购物车成功!");
// ActionContext.getContext().getSession().put("buycar", buycar);
return SUCCESS;
}else
{
setTip("您所购买的数量超过库存数量!");
return INPUT;
}
}
提交表单后 总是直接返回tip页面,没有调用action中定义的方法。
因为后台都没打印System.out.println("0000000");这句话;同学们,帮帮忙。。看看哪里有问题????????谢谢了。。
检查一下,比如如果页面定义一个日期类型的,你后面用String接,
还有一个<s:hidden name="goodsid" value="goodsid"></s:hidden>
默认商品的id我action那边用两个integer
private Integer goodsid;
private Integer num;
来接表单的两个属性。不知道为什么action会直接返回input。。action中的方法都没调用到就直接返回了。。好像是有异常才会这样。我第一想到的是数据转换异常,可是不大可能啊。第二感觉有可能是我表单写的有点怪,会不会有异常。麻烦指点一下。
这样写是没错的我是用spring的注解管理的。 谢谢了。
这样写是没错的我是用spring的注解管理的。 谢谢了。
<action name="shopcar" class="shopcarAction" method="savegoodsincar">
<result name="success">/tip.jsp</result>
<result name="input">/tip.jsp</result>
</action>class="shopcarAction"
好像写错了吧
<action name="shopcar" class="shopcarAction" method="savegoodsincar">
class没错的。。我是用spring注解管理bean的所以spring默认就是那个名
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<context:component-scan base-package="com.shop"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/shopcar"></property>
<property name="username" value="root"></property>
<property name="password" value=""></property>
<property name="maxActive" value="100"></property>
<property name="maxIdle" value="30"></property>
<property name="maxWait" value="500"></property>
<property name="defaultAutoCommit" value="true"></property>
</bean> <bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect
</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/shop/bean/table/Admin.hbm.xml</value>
<value>com/shop/bean/table/Goods.hbm.xml</value>
<value>com/shop/bean/table/Orders.hbm.xml</value>
<value>com/shop/bean/table/User.hbm.xml</value> </list>
</property>
</bean> <bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven transaction-manager="txManager" />
</beans>
<result name="input">/tip.jsp</result>这两个jsp都一样想不跳一个地方都难!
我郁闷了我用注解管理bean的老大。。
说明action 都没被调用到郁闷啊不是跳不跳同一个jsp的问题。。那个是故意让它那样跳的。。
setTip("您所购买的数量超过库存数量!");
return INPUT;
}你把 这个return 的值 改成 ERROR
然后将 success、error还有input 分别指向 3个不同的页
如果还进入input 指向的页
那说明
有问题了
class="*.ShopcarAction" /> *为包名。spring里面有配?
:<action name="shopcar" class="shopcarAction" method="savegoodsincar">
<result name="success">/tip.jsp</result>
<result name="input">/tip.jsp</result>
</action>表单:
<s:form action="shopcar.action?method=savegoodsincar" method="post">
<struts>
<package name="DeptAction" extends="sysPackage" namespace="/sys/manage/dept">
<action name="deptStruts" class="sys-manage-dept-deptAction">
<result>/WEB-INF/pages/sys/manage/dept/dept_tree_staff_info.jsp</result>
<result name="error">/WEB-INF/pages/error.jsp</result>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
spring配置
<beans>
<bean id="sys-manage-dept-deptAction"
class="com.sys.manage.dept.action.DeptAction" scope="request">
<property name="deptFacade" ref="sys-manage-dept-deptFacade" />
<property name="sysmgrlog" ref="sys-log-logFacade" />
<property name="sysMgrIntf" ref="sys-intf-sysMgrIntf" />
</bean> 可供参考。
private String err404Page;
private String loginActionPage;
private String err403Page; private String errorPage;
/**
* 获取登陆信息session中的登陆标志。 已知用户登陆有几种情况
* 1,用户未登陆 状态:0
* 2,用户已登陆 状态:1
* 3,用户登陆后在另一台机子中又一次登陆 状态:2
**/
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
/**
* 取得用户登陆标志.当标志为空时设为0
*/
int loginState = request.getSession().getAttribute(Constants.IS_LOGIN_STATE) == null ? 0 : (Integer) request
.getSession().getAttribute(Constants.IS_LOGIN_STATE); /**
* 目前只针对三种URL不做过滤
* 1直接访问登陆页面
* 2访问错误页面
* 3登陆提交action
*/
//log.info(Constants.IS_LOGIN_STATE +":" + loginState);
// 在无登陆状态下用户登陆标志为空,跳转至登陆界面
switch (loginState) {
case 0: //未登陆
log.info("用户未登陆,请先登陆.");
if(request.getServletPath().equals(this.loginPage) || request.getServletPath().equals(this.err403Page) || request.getServletPath().equals(this.errorPage) || request.getServletPath().equals(this.err404Page) || request.getServletPath().equals(this.loginActionPage)){
filterChain.doFilter(request, response);
return;
}
request.setAttribute("errMsg", "用户未登陆,请先登陆.") ;
response.sendRedirect(request.getContextPath());
//request.getRequestDispatcher(this.loginPage).forward(request, response);
break;
case 1: //已登陆
log.info("登陆成功.");
filterChain.doFilter(request, response);
break;
case 2: //强制退出
log.info("用户已经在其它地方登陆,该帐号强制退出");
request.getSession().setAttribute(Constants.IS_LOGIN_STATE, 0);
response.sendRedirect(request.getContextPath()+this.err403Page);
default:
break;
}
}
value="<s:property value="goodsid"/>"