http://blog.csdn.net/neverthink/article/details/4254469
作为一名新进产品经理,甚至一名资深PM,你可能都或多或少对这个职位产生某种迷惑。到底什么是产品经理?这个职位的主要职责是什么?在IT产业的不同领域,甚至在同一领域的不同公司,这个职位的定义似乎都有不同。
虽然在不同的公司,产品经理的角色和职责互有差异,但是有一些关键职责是任何一个产品经理都应承担的。可以将其归纳为如下六个方面:
1.1 市场调研市场调研是指研究市场以了解客户需求、竞争状况及市场力量(market forces),其最终目标是发现创新或改进产品的潜在机会。
可以通过下面的方式进行市场调研:
1) 与用户和潜在用户交流
2) 与直接面对客户的一线同事(如销售、客服、技术支持等)交流
3) 研究市场分析报告及文章
4) 试用竞争产品
5) 仔细观察用户行为等
市场调研最终会形成商业机会、产品战略或商业需求文档(BRD),详述如何利用潜在的机会。
出现的成果主要为:《商业需求文档(BRD)》或《商业机会》或《产品战略》
1.2 产品定义及设计1、 产品定义是指确定产品需要做哪些事情。通常采用产品需求文档(PRD)来进行描述,PRD可能包含如下信息:
1) 产品的愿景
2) 目标市场
3) 竞争分析
4) 产品功能的详细描述
5) 产品功能的优先级
6) 产品用例(Use Case)
7) 系统需求
8) 性能需求
9) 销售及支持需求等
2、 产品设计是指确定产品的外观,包括用户界面设计(UI,User Interface)和用户交互设计(User Interaction),包含所有的用户体验部分。
在大型公司里,PM通常和UI设计师或互动设计师一起完成产品设计,不过在小公司或者创业公司里,产品经理也许需要全包这些工作。
这是产品经理工作中最有价值的部分,如果产品经理工作中不包含这部分内容,那几乎可以肯定的说,那不是产品经理的工作。
出现的成果主要为:《产品需求文档(PRD)》
1.3 项目管理项目管理是指带领来自不同团队的人员(包括工程师、QA、UI设计师、市场、销售、客服等),在预算内按时开发并发布产品。其中可能包括如下工作内容:
1) 确保资源投入
2) 制定项目计划
3) 根据计划跟踪项目进展
4) 辨别关键路径
5) 必要时争取追加投入
6) 向主管领导报告项目进展状况等
在大型公司里,通常会有项目经理来处理大部分项目管理工作,产品经理只需提供支持。不过在创业公司里,产品经理通常需要自己进行项目管理。在有些公司,技术负责人也可能作为项目经理,处理大部分项目管理事宜。
1.4 产品宣介主要包括和内部同事如老板、销售、市场、客服等沟通产品的优点、功能和目标市场,也可能包括向外界如媒体、行业分析师及用户宣介产品。
大公司的产品经理通常都有产品市场、市场推广和媒体关系(PR)团队帮忙进行对外的产品宣介。
这是除了产品定义和设计之外,对产品经理而言价值第二高的工作,尤其是在向老板、市场同事宣介产品并让他们感到兴奋的时候。
1.5 产品市场主要是对外的信息传播——告诉外界有关产品的信息。通常包括制作产品数据表、手册、网站、Flash演示、媒体专题以及展会演示等。
在大型公司,产品市场工作通常不会由PM来负责,这些公司会有专门的产品市场经理来打理此项工作。当然,这种分工最大的缺点就是导致沟通效率较低,并会削弱对外传播。
在某些公司,“产品管理”和“产品市场”被认为是同义词,会由一个人担当两者的职责。而在那些将产品管理团队和产品市场团队分开的公司,后者会打理本节所提及的工作职责,同时他们也可能会承担“市场调研”、“产品宣介”和“产品生命周期”管理的部分工作。
1.6 产品生命周期管理指那些随着产品经历概念化à发布à成熟à退出市场整个生命周期中的产品管理活动。
主要包括的工作有:
1) 产品定位
2) 产品定价及促销
3) 产品线管理
4) 竞争策略
5) 建立或收购合作伙伴
6) 识别并建立合作关系等
产品经理和产品市场、BD及市场沟通同事一起完成这些工作。
产品周期一般分为五个阶段:
1.6.1 概念化阶段这个阶段主要是提出一些产品概念,市场需求,对于产品而言,仅仅是一些描述而缺乏具体的量化指标,但是这个阶段是周期的基础,只有积累一定量的需求,才能为产品经理的具体工作提供依据。
在这个阶段中,产品经理主要是负责提出概念和进行概念表述,描绘一个产品的轮廓,让相关部门和高层接受这个概念,得到支持和资源分配。
这个阶段可以分为两个步骤:市场数据获取和需求分析。
出现的成果主要为:《市场需求反馈记录》和《需求分析报告》
1.6.2 产品化阶段这个阶段主要是对概念进行图纸化和量化,设定产品指标,形成可设计的功能和产品原型,并且通过公司认可,纳入公司产品开发计划中。
在这个阶段中,产品经理主要是负责对产品进行量化的工作,量化的内容应该包括产品功能,产品模型,开发进度,所需资源。
这个阶段可以分为三个步骤:市场沟通,产品设计和计划确认。
出现的成果主要为:《产品设计文档》,《产品开发计划》和《产品立项单》
1.6.3 技术化阶段这个阶段主要是把图纸化的产品原型进行物理化,依据产品设计文档开发出具有实际操作价值的实物(这里的实物是指可以实现具体功能的物理载体)。
在这个阶段中,主要依靠研发生产部门进行,产品经理的职责就是协调各种资源,全力保障技术化阶段能够按照产品开发计划进行。
这个阶段可以分为两个步骤:产品开发和产品验收
出现的成果主要为:可交付的产品和《技术白皮书》
1.6.4 商品化阶段这个阶段主要是把交付的产品形成具有销售价值的商品,就是对该产品进行商业化包装,这个包括两个部分:内涵商业化和外延商业化。
内涵商业化是指对产品本身进行的商业化过程,比如产品说明书,销售手册,包装元素等;
外延商业化是指促进商品销售的元素确定过程,比如媒体准备,软文准备,渠道准备等。
在这个阶段中,产品经理的主要职责就是负责内涵商业化的整体过程,协助销售部门完成外延商业化的过程,完成产品发布。
这个阶段可以分为两个步骤:商业化和产品发布
出现的主要成果为:可销售的产品和产品发布,以及大量的商品化元素。
1.6.5 市场化阶段这个阶段主要就是跟踪产品发布后的销售进度(我习惯于跟踪3个月),积极推动销售部门完成销售任务,并随时了解销售反馈,进行记录,调整产品在一个产品年度的策略,并对产品的下一步发展提供依据。
在这个阶段中,产品经理的主要职责就是和销售部门进行沟通,协助解决销售过程中遇到的产品问题。
这个阶段可以分为两个步骤:产品跟踪和产品总结
出现的主要成果为:预定的销售渠道完成和销售反馈记录
一般的产品规划周期就是由这五个阶段组成的,在进入到市场化阶段后,其实就可以进入到第一个阶段中了,产品规划的周期本身就是一个螺旋史式发展的过程,从概念开始,逐渐完成一个完成产品的周期,其中包含了多个这样的产品规划周期,而产品经理作为产品的全程参与者,其责任将大大超出横向部门的职责范围,其重要性和不可替代性也是显而易见的,我们可以看到,在那些产品经理体系建立比较完善和重视的企业,其产品的市场感知度相当强烈,产品的市场替代能力也非常强,从而也推动了企业的产品创新能力和开发能力
找了好几个ajax框架,原来使用dorado,太难维护了.事件一大堆,插件经常崩溃.
另外一堆难以解决的问题.很不适合做互联网项目.
为了用户体验,重新寻找ajax框架.
jqueryui.com
以及http://www.ligerui.com/
http://demo.dwzjs.com/
都还不错.
弄来弄去 最终选择了dwzjs,虽然dwz还有很多问题.感觉对java开发还比较友好.
而且有个实例作为参考.先将就着用把.
下面记录下struts2整合dwz.一个痛苦的过程.
A.struts2配置略去.
B.spring action配置
==================nirana-context.xml==========================
<!-- 商品manager beans标签 配置了自动注入,default-autowire="autodetect" 所以同名的bean 会自动注入 -->
<bean id="goodsManagerAction" >
<property name="prdManager">
<ref bean="prdManager"/>
</property>
</bean>
C.struts 配置
<?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">
<struts>
<!-- <include file="struts-default.xml"/> -->
<!-- 是否显示详细错误信息 -->
<constant name="struts.devMode" value="true" />
<!-- 国际化资源文件名称 -->
<constant name="struts.custom.i18n.resources" value="i18n" />
<!-- 是否自动加载国际化资源文件 -->
<constant name="struts.i18n.reload" value="false" />
<!-- convention类重新加载 -->
<constant name="struts.convention.classes.reload" value="false" />
<!-- 浏览器是否缓存静态内容 -->
<constant name="struts.serve.static.browserCache" value="false" />
<!-- 配置使用Spring管理Action -->
<constant name="struts.objectFactory" value="spring" />
<!-- 上传文件大小限制设置 -->
<constant name="struts.multipart.maxSize" value="-1" />
<!-- 主题 -->
<constant name="struts.ui.theme" value="simple" />
<!-- 编码 -->
<constant name="struts.i18n.encoding" value="UTF-8" />
<!-- 后缀 -->
<constant name="struts.action.extension" value="action" />
<!-- 结果资源的路径 -->
<constant name="struts.convention.result.path" value="/web/" />
<!-- URL资源分隔符 -->
<constant name="struts.convention.action.name.separator" value="_" />
<!-- spring 缓存机制 -->
<constant name="struts.objectFactory.spring.useClassCache" value="false"/>
<package name="basePackage" extends="struts-default">
<interceptors>
<interceptor-stack name="baseStack">
<interceptor-ref name="exception" />
<interceptor-ref name="alias" />
<interceptor-ref name="servletConfig" />
<interceptor-ref name="i18n" />
<interceptor-ref name="prepare" />
<interceptor-ref name="chain" />
<interceptor-ref name="debugging" />
<interceptor-ref name="scopedModelDriven" />
<interceptor-ref name="modelDriven" />
<interceptor-ref name="fileUpload" />
<interceptor-ref name="checkbox" />
<interceptor-ref name="multiselect" />
<interceptor-ref name="staticParams" />
<interceptor-ref name="actionMappingParams" />
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*</param>
</interceptor-ref>
<interceptor-ref name="conversionError"/>
<!-- 配置方法级别的校验 -->
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
<param name="validateAnnotatedMethodOnly">true</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 配置默认拦截器栈 -->
<default-interceptor-ref name="baseStack" />
<!-- 未到找Action指向页面 -->
<default-action-ref name="errorPage" />
<global-results>
<result name="ajaxDone">/dwztest/ajaxDone.jsp</result>
</global-results>
<action name="errorPage">
<result type="redirect">/html/error_page_404.html</result>
</action>
</package>
<!-- 涅磐 action -->
<package name="nirvana" extends="basePackage" namespace="/nirvana">
<action name="nirvanaAction" >
<result name="userlogin">/nirvana/nirvana_userlogin.jsp</result>
<result name="test">/nirvana/nirvana_test.ftl</result>
<result name="list">/nirvana/nirvana_list.jsp</result>
<result name="addGoods">/nirvana/addGoods.jsp</result>
</action>
</package>
<!-- json 测试action -->
<package name="json" extends="struts-default,json-default" namespace="/json">
<action name="jsonAction" >
<interceptor-ref name="params"/>
<result type="json">
<!-- <param name="root">jsonResult</param> -->
<param name="includeProperties">
goodsList\[\d+\]\.goods_uid,goodsList\[\d+\]\.goods_name
</param>
</result>
</action>
<action name="goodAddAction" >
<result type="json"></result>
</action>
</package>
<package name="dwz" extends="basePackage" namespace="/dwz">
<action name="goodsManagerAction" >
<result name="list">/dwztest/goods_manager_list.jsp</result>
<result name="input">/dwztest/goods_manager_input.jsp</result>
<result name="addOk" type="redirectAction">goodsManagerList</result>
</action>
<action name="goodsManagerList"
method="list">
<result name="list">/dwztest/goods_manager_list.jsp</result>
</action>
</package>
</struts>
D.提交后相应页面,其实就是返回回调函数的一些数据,用于执行回调
==================ajaxDone.jsp===========================
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
{
"statusCode":"${statusCode}",
"message":"${tipsMessage}",
"forwardUrl":"${forwardUrl}",
"navTabId":"${param.navTabId}",
"callbackType":"${param.callbackType}"
}
E.主页
===================dwz.jsp=================
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=7" />
<title>简单实用国产jQuery UI框架 - DWZ富客户端框架(J-UI.com)</title>
<link href="/SCM/ui/dwz/themes/default/style.css" rel="stylesheet" type="text/css" />
<link href="/SCM/ui/dwz/themes/css/core.css" rel="stylesheet" type="text/css" />
<link href="/SCM/ui/dwz/uploadify/css/uploadify.css" rel="stylesheet" type="text/css" />
<!--[if IE]>
<link href="/SCM/ui/dwz/themes/css/ieHack.css" rel="stylesheet" type="text/css" />
<![endif]-->
<script src="/SCM/ui/dwz/js/speedup.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/jquery-1.4.4.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/jquery.cookie.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/jquery.validate.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/jquery.bgiframe.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/xheditor/xheditor-1.1.8-zh-cn.min.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/uploadify/scripts/swfobject.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/uploadify/scripts/jquery.uploadify.v2.1.0.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.core.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.util.date.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.validate.method.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.regional.zh.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.barDrag.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.drag.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.tree.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.accordion.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.ui.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.theme.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.switchEnv.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.alertMsg.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.contextmenu.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.navTab.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.tab.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.resize.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.dialog.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.dialogDrag.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.cssTable.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.stable.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.taskBar.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.ajax.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.pagination.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.database.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.datepicker.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.effects.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.panel.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.checkbox.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.history.js" type="text/javascript"></script>
<script src="/SCM/ui/dwz/js/dwz.combox.js" type="text/javascript"></script>
<!--
<script src="/blog_article/bin/dwz.min.js" type="text/javascript"></script>
-->
<script src="/SCM/ui/dwz/js/dwz.regional.zh.js" type="text/javascript"></script>
<script type="text/javascript">
$(function(){
DWZ.init("/SCM/ui/dwz/dwz.frag.xml", {
//loginUrl:"login_dialog.html", loginTitle:"登录", // 弹出登录对话框
loginUrl:"login.jsp", // 跳到登录页面
statusCode:{ok:200, error:300, timeout:301}, //【可选】
pageInfo:{pageNum:"pageNum", numPerPage:"numPerPage", orderField:"orderField", orderDirection:"orderDirection"}, //【可选】
debug:false, // 调试模式 【true|false】
callback:function(){
initEnv();
$("#themeList").theme({themeBase:"/SCM/ui/dwz/themes"});
}
});
});
</script>
</head>
<body scroll="no">
<div id="layout">
<div id="header">
<div >
<a href="http://j-ui.com">标志</a>
<ul >
<li id="switchEnvBox"><a href="javascript:">(<span>北京</span>)切换城市</a>
<ul>
<li><a href="/blog_article/sidebar_1.html">北京</a></li>
<li><a href="/blog_article/sidebar_2.html">上海</a></li>
<li><a href="/blog_article/sidebar_2.html">南京</a></li>
<li><a href="/blog_article/sidebar_2.html">深圳</a></li>
<li><a href="/blog_article/sidebar_2.html">广州</a></li>
<li><a href="/blog_article/sidebar_2.html">天津</a></li>
<li><a href="/blog_article/sidebar_2.html">杭州</a></li>
</ul>
</li>
<li><a href="/blog_article/changepwd.html" target="dialog" width="600">设置</a></li>
<li><a href="http://www.cnblogs.com/dwzjs" target="_blank">博客</a></li>
<li><a href="http://weibo.com/dwzui" target="_blank">微博</a></li>
<li><a href="http://bbs.dwzjs.com" target="_blank">论坛</a></li>
<li><a href="/blog_article/login.html">退出</a></li>
</ul>
<ul id="themeList">
<li theme="default"><div >蓝色</div></li>
<li theme="green"><div>绿色</div></li>
<!--<li theme="red"><div>红色</div></li>-->
<li theme="purple"><div>紫色</div></li>
<li theme="silver"><div>银色</div></li>
<li theme="azure"><div>天蓝</div></li>
</ul>
</div>
<!-- navMenu -->
</div>
<div id="leftside">
<div id="sidebar_s">
<div >
<div ><div></div></div>
</div>
</div>
<div id="sidebar">
<div ><h2>主菜单</h2><div>收缩</div></div>
<div fillSpace="sidebar">
<div >
<h2><span>Folder</span>界面组件</h2>
</div>
<div >
<ul >
<li><a href="/blog_article/tabsPage.html" target="navTab">主框架面板</a>
<ul>
<li><a href="/blog_article/main.html" target="navTab" rel="main">我的主页</a></li>
<li><a href="http://www.baidu.com" target="navTab" rel="page1">页面一(外部页面)</a></li>
<li><a href="/SCM/nirvana/nirvanaAction!addGoods.action" target="navTab" rel="external" external="true">测试DWZ</a></li>
<li><a href="/SCM/dwz/goodsManagerAction!list.action" target="navTab" rel="page100" >商品管理</a></li>
<li><a href="/SCM/purchase/add_stock_order.html" target="navTab" rel="stock" external="true">采购订单</a></li>
<li><a href="/blog_article/demo_page2.html" target="navTab" rel="external" external="true">iframe navTab页面</a></li>
<li><a href="/blog_article/demo_page1.html" target="navTab" rel="page1" fresh="false">替换页面一</a></li>
<li><a href="/blog_article/demo_page2.html" target="navTab" rel="page2">页面二</a></li>
<li><a href="/blog_article/demo_page4.html" target="navTab" rel="page3" title="页面三(自定义标签名)">页面三</a></li>
<li><a href="/blog_article/demo_page4.html" target="navTab" rel="page4" fresh="false">测试页面(fresh="false")</a></li>
<li><a href="/blog_article/w_editor.html" target="navTab">表单提交会话超时</a></li>
<li><a href="/blog_article/ajaxTimeout.html" target="navTab">navTab会话超时</a></li>
<li><a href="/blog_article/ajaxTimeout.html" target="dialog">dialog会话超时</a></li>
<li><a href="/blog_article/index_menu.html" target="_blank">横向导航条</a></li>
</ul>
</li>
<li><a>常用组件</a>
<ul>
<li><a href="/blog_article/w_panel.html" target="navTab" rel="w_panel">面板</a></li>
<li><a href="/blog_article/w_tabs.html" target="navTab" rel="w_tabs">选项卡面板</a></li>
<li><a href="/blog_article/w_dialog.html" target="navTab" rel="w_dialog">弹出窗口</a></li>
<li><a href="/blog_article/w_alert.html" target="navTab" rel="w_alert">提示窗口</a></li>
<li><a href="/blog_article/w_list.html" target="navTab" rel="w_list">CSS表格容器</a></li>
<li><a href="/blog_article/demo_page1.html" target="navTab" rel="w_table">表格容器</a></li>
<li><a href="/blog_article/w_removeSelected.html" target="navTab" rel="w_table">表格数据库排序+批量删除</a></li>
<li><a href="/blog_article/w_tree.html" target="navTab" rel="w_tree">树形菜单</a></li>
<li><a href="/blog_article/w_accordion.html" target="navTab" rel="w_accordion">滑动菜单</a></li>
<li><a href="/blog_article/w_editor.html" target="navTab" rel="w_editor">编辑器</a></li>
<li><a href="/blog_article/w_datepicker.html" target="navTab" rel="w_datepicker">日期控件</a></li>
<li><a href="/blog_article/db_widget.html" target="navTab" rel="w_datepicker">dwz.database.js</a></li>
</ul>
</li>
<li><a>表单组件</a>
<ul>
<li><a href="/blog_article/db_masterEdit.html" target="navTab" rel="masterEdit">表单主从结构</a></li>
<li><a href="/blog_article/w_validation.html" target="navTab" rel="w_validation">表单验证</a></li>
<li><a href="/blog_article/w_button.html" target="navTab" rel="w_button">按钮</a></li>
<li><a href="/blog_article/w_textInput.html" target="navTab" rel="w_textInput">文本框/文本域</a></li>
<li><a href="/blog_article/w_combox.html" target="navTab" rel="w_combox">下拉菜单</a></li>
<li><a href="/blog_article/w_checkbox.html" target="navTab" rel="w_checkbox">多选框/单选框</a></li>
<li><a href="/blog_article/demo_upload.html" target="navTab" rel="demo_upload">iframeCallback表单提交</a></li>
<li><a href="/blog_article/w_uploadify.html" target="navTab" rel="w_uploadify">uploadify多文件上传</a></li>
</ul>
</li>
<li><a href="/blog_article/dwz.frag.xml" target="navTab" external="true">dwz.frag.xml</a></li>
</ul>
</div>
<div >
<h2><span>Folder</span>典型页面</h2>
</div>
<div >
<ul >
<li><a href="/blog_article/demo_page1.html" target="navTab" rel="demo_page1">查询我的客户</a></li>
<li><a href="/blog_article/demo_page1.html" target="navTab" rel="demo_page2">表单查询页面</a></li>
<li><a href="/blog_article/demo_page4.html" target="navTab" rel="demo_page4">表单录入页面</a></li>
<li><a href="/blog_article/demo_page5.html" target="navTab" rel="demo_page5">有文本输入的表单</a></li>
<li><a href="javascript:;">有提示的表单输入页面</a>
<ul>
<li><a href="javascript:;">页面一</a></li>
<li><a href="javascript:;">页面二</a></li>
</ul>
</li>
<li><a href="javascript:;">选项卡和图形的页面</a>
<ul>
<li><a href="javascript:;">页面一</a></li>
<li><a href="javascript:;">页面二</a></li>
</ul>
</li>
<li><a href="javascript:;">选项卡和图形切换的页面</a></li>
<li><a href="javascript:;">左右两个互动的页面</a></li>
<li><a href="javascript:;">列表输入的页面</a></li>
<li><a href="javascript:;">双层栏目列表的页面</a></li>
</ul>
</div>
<div >
<h2><span>Folder</span>流程演示</h2>
</div>
<div >
<ul >
<li><a href="/blog_article/newPage1.html" target="dialog" rel="dlg_page">列表</a></li>
<li><a href="/blog_article/newPage1.html" target="dialog" rel="dlg_page">列表</a></li>
<li><a href="/blog_article/newPage1.html" target="dialog" rel="dlg_page2">列表</a></li>
<li><a href="/blog_article/newPage1.html" target="dialog" rel="dlg_page2">列表</a></li>
<li><a href="/blog_article/newPage1.html" target="dialog" rel="dlg_page2">列表</a></li>
</ul>
</div>
</div>
</div>
</div>
<div id="container">
<div id="navTab" >
<div >
<div ><!-- 显示左右控制时添加 -->
<ul >
<li tabid="main" ><a href="javascript:;"><span><span >我的主页</span></span></a></li>
</ul>
</div>
<div >left</div><!-- 禁用只需要添加一个样式 -->
<div >right</div><!-- 禁用只需要添加一个样式 -->
<div >more</div>
</div>
<ul >
<li><a href="javascript:;">我的主页</a></li>
</ul>
<div >
<div >
<div >
<div >
<h2><a href="/blog_article/doc/dwz-user-guide.pdf" target="_blank">DWZ框架使用手册(PDF)</a></h2>
<a href="/blog_article/doc/dwz-user-guide.swf" target="_blank">DWZ框架演示视频</a>
</div>
<div >
<p><a href="/blog_article/doc/dwz-user-guide.zip" target="_blank" >DWZ框架使用手册(CHM)</a></p>
<p><a href="/blog_article/doc/dwz-ajax-develop.swf" target="_blank" >DWZ框架Ajax开发视频教材</a></p>
</div>
<p><span>DWZ富客户端框架</span></p>
<p>DWZ官方微博:<a href="http://weibo.com/dwzui" target="_blank">http://weibo.com/dwzui</a></p>
</div>
<div layoutH="80" >
<p >DWZ官方微博 <a href="http://weibo.com/dwzui" target="_blank">http://weibo.com/dwzui</a></p>
<p >DWZ官方微群 <a href="http://q.weibo.com/587328/invitation=11TGXSt-148c2" target="_blank">http://q.weibo.com/587328/invitation=11TGXSt-148c2</a></p>
</div>
<div layoutH="80">
<iframe width="100%" height="430" frameborder="0" scrolling="no" src="http://service.t.sina.com.cn/widget/WeiboShow.php?width=0&height=430&fansRow=1&ptype=1&speed=0&skin=1&isTitle=1&noborder=1&isWeibo=1&isFans=1&uid=1739071261&verifier=c683dfe7"></iframe>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="footer">Copyright © 2010 <a href="/blog_article/demo_page2.html" target="dialog">DWZ研发组</a></div>
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-16716654-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? ' https://ssl' : ' http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</body>
</html>
F.列表页
==================goods_manager_list.jsp===================
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html;charset=utf-8"%>
<%@ include file="/dwztest/dwz_include.jsp"%>
<form id="pagerForm" action="/blog_article/loginList.action">
<input type="hidden" name="pageInfo.currentPage" value="${pageInfo.currentPage}" />
<input type="hidden" name="lookup" value="${lookup}" />
</form>
<div >
<form rel="pagerForm" method="post" action="/SCM/dwz/goodsManagerAction!list.action" onsubmit="return dwzSearch(this, '${targetType}');">
<input type="hidden" name="pageInfo.pageSize" value="${pageInfo.pageSize}" />
<div >
<ul >
</ul>
<div >
<div ><div ><button type="submit">查询</button></div></div>
</div>
</div>
</form>
</div>
<div >
<div >
<ul >
<li><a href="/SCM/dwz/goodsManagerAction!add.action" target="navTab" rel="login"><span>新建</span></a></li>
<li><a href="/SCM/dwz/goodsManagerAction!del.action" target="removeSelected" title="确实要删除这些记录吗?"><span>批量删除</span></a></li>
</ul>
</div>
<table width="100%" layoutH="138" targetType="${targetType}">
<thead>
<tr>
<th width="22"><input type="checkbox" group="orderIndexs" ></th>
<th>商品编号</th>
<th>商品名称</th>
</tr>
</thead>
<tbody>
<c:forEach var="item" items="${goodsList}" varStatus="s">
<tr>
<td><input name="orderIndexs" value="${item.goods_uid}" type="checkbox"></td>
<td>${item.goods_code}</td>
<td>${item.goods_name}</td>
</tr>
</c:forEach>
</tbody>
</table>
<div >
<div >
<span>每页</span>
<c:set var="pageSizeList" value="${fn:split('10|20|50|100', '|')}"/>
<select name="pageInfo.pageSize" onchange="dwzPageBreak({targetType:'${targetType}', numPerPage:this.value})">
<c:forEach var="item" items="${pageSizeList}">
<option value="${item}" ${item eq pageInfo.pageSize ? 'selected="selected"' : ''}>${item}</option>
</c:forEach>
</select>
<span>条,共${pageInfo.totalRecords}条</span>
</div>
<div targetType="${targetType}" totalCount="${pageInfo.totalRecords}" numPerPage="${pageInfo.pageSize}" pageNumShown="${pageInfo.totalPage}" currentPage="${pageInfo.currentPage}"></div>
</div>
</div>
G.添加页
==================goods_manager_input.jsp========================================
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html;charset=utf-8"%>
<%@ include file="/dwztest/dwz_include.jsp"%>
<h2 >商品编辑页面</h2>
<form action="/SCM/dwz/goodsManagerAction!save/navTabId/page100/amp;callbackType/closeCurrent/amp;ajax/1.action" method="post" onsubmit="return validateCallback(this, navTabAjaxDone)">
<div >
<div layoutH="97">
<dl>
<dt>类目id:</dt>
<dd><input type="text" name="goods.catagory_uid" value="${goods.catagory_uid}" /></dd>
</dl>
<dl>
<dt>商品编号:</dt>
<dd><input type="text" name="goods.goods_code" value="${goods.goods_code}" /></dd>
</dl>
<dl>
<dt>商品名称:</dt>
<dd><input type="text" name="goods.goods_name" value="${goods.goods_name}" /></dd>
</dl>
<dl>
<dt>采购价:</dt>
<dd><input type="text" name="goods.prime_price" value="${goods.prime_price}" /></dd>
</dl>
<dl>
<dt>销售价:</dt>
<dd><input type="text" name="goods.sale_price" value="${goods.sale_price}" /></dd>
</dl>
<dl>
<dt>是否多规格:</dt>
<dd><input type="text" name="goods.ismutil" value="${goods.ismutil}" /></dd>
</dl>
<dl>
<dt>状态:</dt>
<dd><input type="text" name="goods.status" value="${goods.status}" /></dd>
</dl>
<div ></div>
</div>
<div >
<ul>
<li><div ><div ><button type="submit">保存</button></div></div></li>
<li><div ><div ><button type="button">关闭</button></div></div></li>
</ul>
</div>
</div>
</form>
h.GoodsManagerAction
=====================GoodsManagerAction.java==========================
/**
*
*/
package com.bstek.scm.action.dwz;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.struts2.ServletActionContext;
import org.marmot.view.Page;
import com.bstek.scm.bo.prd.PrdManager;
import com.bstek.scm.common.exception.ManagerException;
import com.bstek.scm.common.tools.LogFactory;
import com.bstek.scm.pojo.prd.Goods;
/**
* 商品管理action
* @author fengbin
* @createDate Aug 22, 2011 9:00:13 PM
*/
public class GoodsManagerAction extends BaseAction {
private static final long serialVersionUID = -876958304704173139L;
private Goods goods;
private GoodsManagerPageInfo pageInfo;
private List<Goods> goodsList;
//商品manager
private PrdManager prdManager;
/**
* 获取所有商品
* @return
*/
public String list(){
try {
int pageSize = 20;
int pageIndex = 1;
Map<String,Object> parameters = new HashMap<String,Object>();
Page page =prdManager.getGoods(parameters, pageSize, pageIndex);
goodsList = page.getList();
pageInfo = new GoodsManagerPageInfo();
pageInfo.setCurrentPage(1);
pageInfo.setTotalRecords(page.getTotalCount());
} catch (ManagerException e) {
LogFactory.errLog.error("保存采购入库单出错!",e);
}
return "list";
}
/**
* 新建
* @param prdManager
*/
public String add(){
goods=null;
return "input";
}
/**
* 保存
* @param prdManager
*/
public String save(){
try {
prdManager.saveGoods(goods);
ServletActionContext.getResponse().setContentType("text/html");
} catch (ManagerException e) {
LogFactory.errLog.error("商品添加出错!",e);
}
return ajaxForwardSuccess("商品添加成功!");
}
public void setPrdManager(PrdManager prdManager) {
this.prdManager = prdManager;
}
public void setGoods(Goods goods) {
this.goods = goods;
}
public void setPageInfo(GoodsManagerPageInfo pageInfo) {
this.pageInfo = pageInfo;
}
public void setGoodsList(List<Goods> goodsList) {
this.goodsList = goodsList;
}
public Goods getGoods() {
return goods;
}
public GoodsManagerPageInfo getPageInfo() {
return pageInfo;
}
public List<Goods> getGoodsList() {
return goodsList;
}
}
g.BaseAction
==========================================================
package com.bstek.scm.action.dwz;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionProxy;
import com.opensymphony.xwork2.ActionSupport;
public class BaseAction extends ActionSupport{
private static final long serialVersionUID = -676538067021681709L;
private String lookup;
private String workflow;
// private Object errorObject;
protected static final String DOWNLOAD = "download";
protected static final String AUTO = "auto";
private ActionProxy proxy;
private int statusCode = 200;
private String tipsMessage;
private String forwardUrl;
private String ajax;
public ActionProxy getProxy()
{
if (this.proxy == null)
this.proxy = ActionContext.getContext().getActionInvocation().getProxy();
return this.proxy;
}
public String getLookup() {
return this.lookup;
}
public void setLookup(String lookup) {
this.lookup = lookup;
}
public HttpServletRequest getRequest() {
return ServletActionContext.getRequest();
}
public HttpServletResponse getResponse() {
return ServletActionContext.getResponse();
}
public HttpSession getSession()
{
return ServletActionContext.getRequest().getSession(true);
}
public String getParameter(String name) {
return getRequest().getParameter(name);
}
// public Object getErrorObject() {
// return this.errorObject;
// }
//
// public void setErrorObject(Object errorObject) {
// this.errorObject = errorObject;
// }
protected Date getDateFromStr(String sendTime_str)
{
Date returnDate = null;
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
if ((sendTime_str == null) || (sendTime_str.equals("")))
{
return null;
}
try
{
returnDate = df.parse(sendTime_str);
}
catch (Exception e)
{
returnDate = null;
}
return returnDate;
}
public String getWorkflow() {
return this.workflow;
}
public void setWorkflow(String workflow) {
this.workflow = workflow;
}
protected String returnCommand(){
return returnCommand(null);
}
protected String returnCommand(String message) {
if ((((this.ajax == null) || (!(this.ajax.trim().equals("1"))))) && (message == null))
return "success";
if (message == null) {
//ajaxForwardSuccess(I18NUtil.getString("鎿嶄綔鎴愬姛"))
return ajaxForwardSuccess("成功!");
}
return ajaxForwardError(message);
}
public void setAjax(String ajax)
{
this.ajax = ajax;
}
public int getStatusCode() {
return this.statusCode;
}
public void setStatusCode(int statusCode) {
this.statusCode = statusCode;
}
public String getTipsMessage() {
return this.tipsMessage;
}
public void setTipsMessage(String tipsMessage) {
this.tipsMessage = tipsMessage;
}
public String getForwardUrl() {
return this.forwardUrl;
}
public void setForwardUrl(/blog_article/String forwardUrl/index.html) {
this.forwardUrl = forwardUrl; }
public String getTargetType() {
if ((this.lookup != null) && (this.lookup.length() > 0)) {
return "dialog";
}
return "navTab";
}
private String ajaxForward(int statusCode, String message) {
this.statusCode = statusCode;
this.tipsMessage = message;
return "ajaxDone";
}
/**
* ajax 提交后跳转
* @param message
* @return
*/
protected String ajaxForwardSuccess(String message) {
return ajaxForward(200, message);
}
/**
* ajax 提交失败后跳转
* @param message
* @return
*/
protected String ajaxForwardError(String message) {
return ajaxForward(300, message);
}
}
原理:
goods_manager_input.jsp页面中
<form action="/SCM/dwz/goodsManagerAction!save/navTabId/page100/amp;callbackType/closeCurrent/amp;ajax/1.action" method="post" onsubmit="return validateCallback(this, navTabAjaxDone)">
提交后跳转到ajaxDone.jsp 页面
这个页面就是回调函数,需要用到的数据.
然后通过 navTabAjaxDone 这个回调函数执行相应的处理.关闭当前页面.
android:windowSoftInputMode=["stateUnspecified",
"stateUnchanged", "stateHidden",
"stateAlwaysHidden", "stateVisible",
"stateAlwaysVisible", "adjustUnspecified",
"adjustResize", "adjustPan"] >