Liferay Struts2 完整实例 修正

合集下载

Struts2环境配置及配置过程小问题的解决

Struts2环境配置及配置过程小问题的解决

Struts 的环境配置,及常见小问题解决方案该文档是我学习时候记得笔记,现在拿出来和大家分享.记得不好,希望大家批评指正首先我们学习一下开发环境的配置:该文档中的大部分内容均以图片展示.观看时可以酌情地放大观看.呵呵呵第一步:新建project →web Project →…;第二步:我们需要把项目tomcat使用的apache 的服务根目录设置一下:Window → preference → MyEclipse →Server→ TomCat选取路径;如图:选取apache路径:第三步:设置installed path ,注意这里要是用的是jdk;1.6.0_13;第四步:添加Struts2 路径解压从网站上下载的压缩包struts-2.3.4;解压开后是这样的:第五步:点开apps 的实例程序,解压开把struts放到所建项目的src 目录下边;第六步:添加扩展包:复制到第七步:更改web.xml 文件:下边的文档是apps中的web_inf 下边的web.xml的记事本打开图将选中的代码copy到项目中web.xml 中的相应位置;结果如图:注意:刚粘贴的文档选中的这行结尾词不是j2ee,把它改成j2ee 否则将报错.这可能是版本的原因导致的吧;<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAn dExecuteFilter</filter-class>这句话中的 ng..ng代表的new generation .的意思;第八步:打开src下边的struts 配置文件注释:<struts ></struts>标签之间的内容;将中间的<package></package>标签和内容copy到下边;更改结果如图:注意将web_inf 目录下边的index.jsp改名为hello.jsp;这样就可以访问了; 接下来基本上可以调试了:第一步:启动服务器:记住选中自己配置的tomcat 服务器; 打开浏览器:地址栏中输入:如图:先测试服务器:再测试自己的hello.jsp,测试文件;注意有一点儿关于dtd文件的配置:由于原来填写的内容是从网上获取的,多慢啊是吧;我们现在把它配置成本地开发模式的使用的;第一步:这样的话他就会把每次更改后的文件部署到服务器上,而不用每次更改都重启服务器; 第二步:注意:这里的dtd文件是从struts 文件的解压出来的,只需要引入路径即可;软件1002班 10 / 11 王圣玺注意Tomcat 的web 配置,以及JDK 配置一定要和installed jre 等一致:添加src 文件的扩展文件:黄河水院 struts2的环境配置 信息工程系 软件1002班 11 / 11 王圣玺QQ:820215725 Struts 的运行机制:请求与展现分开(struts2 的核心内容):好了,该文档目前就先写到这里,写得不好,请大家批评指正,如果有不懂或者想要共同学习提高的哥们,姐们,请联系我.O(∩_∩)O 哈哈哈~。

struts2教程实例

struts2教程实例

struts2教程实例1.第⼀个struts2项⽬建议:参考官⽅配置操作⼀遍,因为技术不断更新,不同版本的struts的类可能不同,⽼版本的多个类可能在新版本中集成了⼀个2.struts2⼯作流程原理2.1步骤1.创建Web Project2.导⼊Jar(使⽤maven控制的话,配置pom.xml)<!--pom配置见 -->3.在web.xml配置struts2的过滤器<filter><filter-name>struts2</filter-name><!--该类会因struts版本不同⽽变化,在struts2.0-2.1.2为org.apache.struts2.dispatcher.FilterDispatcher,在之后版本为下述--> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><!-- 所有的url都会被url过滤器解析 --><url-pattern>/*</url-pattern></filter-mapping>4.创建Struts核⼼xml⽂件5.创建action类继承与ActionSupport6.配置struts.xml<!--详细配置及介绍见:-->2.2流程1、客户端浏览器发出HTTP请求2、该请求被StrutsPrepareAndExecuteFilter接收3、根据struts.xml配置,找到需要调⽤的Action类和⽅法,并通过IoC⽅式,将值注⼊给Aciton4、Action调⽤业务逻辑组件处理业务逻辑5、Action执⾏完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页⾯6、返回HTTP响应到客户端浏览器2.3原理注意:在struts2.1.2后FilterDispatcher被替换为了StrutsPrepareAndExecuteFilter1、客户端初始化⼀个指向Servlet容器(例如Tomcat)的请求2、这个请求经过⼀系列的过滤器(Filter)(这些过滤器中有⼀个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)3、接着被StrutsPrepareAndExecuteFilter(能够拦截请求对象ServletRequest和ServletResponse结合Struts.xml构建独⽴于servlet的ActionContxt)调⽤,StrutsPrepareAndExecuteFilter询问ActionMapper(含有struts.xml中Action配置的name,namespce,result等的HashMap)来决定这个请是否需要调⽤某个Action4、如果ActionMapper决定需要调⽤某个Action,StrutsPrepareAndExecuteFilter把请求的处理交给ActionProxy5、 ActionProxy通过Configuration Manager询问框架的配置⽂件struts.xml,找到需要调⽤的Action类6、 ActionProxy创建⼀个ActionInvocation的实例。

struts2+spring+hibernate3.3增删改查的实例图文详解(II)

struts2+spring+hibernate3.3增删改查的实例图文详解(II)

S2SH的增删改查的实现第一步通过逆向工程得到实体类和Dao类实体类点击红色方框中的选项点击红色方框左边的展开标识右键单击TABLE下的datas点击红色方框中选项点击Browse选择项目和创建实体类被放的包,并选中相应的选项,点击Next点击Next点击FinishDao类点击红色方框中的选项点击红色方框左边的展开标识右键单击TABLE下的datas点击红色方框中选项包名改成com.beijing.dao,选择相应选项,点击Next点击Next点击Finish选中dao,用快捷键Ctrl+Shift+O导入实体类的包第二步在applicationContext.xml中添加数据源节点左键连击点击Source右键单击选中红色方框的选项,添加数据源点击FinishapplicationContext.xml代码如下<?xml version="1.0"encoding="UTF-8"?> <beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:p="/schema/p"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-3.0.xsd"><bean id="dataSource"class="mons.dbcp.BasicDataSource"><property name="driverClassName"value="com.microsoft.sqlserver.jdbc.SQLServerDriver"> </property><property name="url"value="jdbc:sqlserver://localhost:1433"></property><property name="username" value="sa"></property> </bean><bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean "><property name="dataSource" ref="dataSource"></property><property name="configLocation"value="classpath:hibernate.cfg.xml"></property></bean><bean id="DatasDAO"class="com.beijing.dao.DatasDAO"><property name="sessionFactory"><ref bean="sessionFactory"/></property></bean></beans>第三步用hibernate提供的方法进行增删改查注意:将dao方法里的一些不用的方法删除留下的方法如下:package com.beijing.dao;import java.util.List;import org.hibernate.HibernateException;import org.hibernate.LockMode;import org.hibernate.Query;import org.hibernate.Session;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.context.ApplicationContext;import org.springframework.dao.DataAccessResourceFailureException; importorg.springframework.orm.hibernate3.support.HibernateDaoSupport; import org.springframework.stereotype.Repository;import com.beijing.pojo.Datas;public class DatasDAO extends HibernateDaoSupport {private static final Logger log= LoggerFactory.getLogger(DatasDAO.class);//保存的方法public void save(Datas transientInstance) {log.debug("saving Datas instance");try {getHibernateTemplate().save(transientInstance);log.debug("save successful");} catch (RuntimeException re) {log.error("save failed", re);throw re;}}//删除的方法public void delete(Datas persistentInstance) {log.debug("deleting Datas instance");try {getHibernateTemplate().delete(persistentInstance);log.debug("delete successful");} catch (RuntimeException re) {log.error("delete failed", re);throw re;}}//根据实体的主键Id得到实体的方法public Datas findById(ng.Integer id) {log.debug("getting Datas instance with id: " + id);try {Datas instance = (Datas) getHibernateTemplate().get("com.beijing.pojo.Datas", id);return instance;} catch (RuntimeException re) {log.error("get failed", re);throw re;}}//数据全查的方法,不含分页public List findAll() {log.debug("finding all Datas instances");try {String queryString = "from Datas";return getHibernateTemplate().find(queryString);} catch (RuntimeException re) {log.error("find all failed", re);throw re;}}//数据全查的方法,含分页public List findAll(int pageSize, int pageNow) { log.debug("finding all Datas instances");Session session = null;try {String queryString = "from Datas";session = this.getSession();Query query = session.createQuery(queryString);int firstResultIndex = pageSize * (pageNow - 1);query.setFirstResult(firstResultIndex);query.setMaxResults(pageSize);List list = query.list();return list;} catch (RuntimeException re) {log.error("find all failed", re);throw re;} finally {//记得session要关闭,不然导致浏览器加载数据缓慢session.close();}}//修改的方法有两个调用任何都行,区别是第一个返回一个实体,第二个不返回//修改的方法1public Datas merge(Datas detachedInstance) {log.debug("merging Datas instance");try {Datas result = (Datas) getHibernateTemplate().merge(detachedInstance);log.debug("merge successful");return result;} catch (RuntimeException re) {log.error("merge failed", re);throw re;}}//修改的方法2public void update(Datas detachedInstance) {log.debug("merging Datas instance");try {super.getHibernateTemplate().update(detachedInstance);log.debug("merge successful");} catch (RuntimeException re) {log.error("merge failed", re);throw re;}}//得到总共多少条数据的方法public int getCount() {System.out.println("pageCount");Session session = null;int count = 0;try {String queryString = "select count(*) from Datas";session = this.getSession();Query query = session.createQuery(queryString);count = Integer.valueOf(query.uniqueResult().toString());} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {//记得session要关闭,不然导致浏览器加载数据缓慢session.close();}return count;}//每pageSize个数据,有几页数据public int getPageCount(int count,int pageSize) { int pageCount = count/pageSize;if(count%pageSize > 0) {pageCount++;}return pageCount;}}第四步做一个biz包,也叫业务包,和biz的接口1 bizpackage ;import java.util.List;import javax.annotation.Resource;import org.springframework.stereotype.Service;import com.beijing.dao.DatasDAO;import com.beijing.pojo.Datas;public class DataBiz implements IDataBiz {private DatasDAO datasDao;//set了datasDao是用来spring注入管理的public void setDatasDao(DatasDAO datasDao) {this.datasDao = datasDao;}//下面也是调用dao增删改查的一些方法public void delete(Datas data) {datasDao.delete(data);}public List find() {return datasDao.findAll();}public void save(Datas d) {datasDao.save(d);}public void update(Datas data) {datasDao.merge(data);}public List find(int pageSize, int nowPage) {return datasDao.findAll(pageSize, nowPage);}public int getCount() {return datasDao.getCount();}public int getPageCount(int count,int pageSize) { // TODO Auto-generated method stubreturn datasDao.getPageCount(count,pageSize);}public Datas findById(int id) {// TODO Auto-generated method stubreturn datasDao.findById(id);}}2 IBizpackage ;import java.util.List;import com.beijing.pojo.Datas;public interface IDataBiz {//action调用的是这个接口public void save(Datas d);public void delete(Datas daId);public void update(Datas data);public Datas findById(int id);public List find();public int getCount();public List find(int pageSize, int nowPage);public int getPageCount(int count,int pageSize);}第五步做一个action写入调用biz增删改查的方法代码如下:package com.beijing.ac;import java.util.Iterator;import java.util.List;import javax.annotation.Resource;import org.springframework.stereotype.Service;import .IDataBiz;import com.beijing.pojo.Datas;import com.opensymphony.xwork2.ActionSupport;public class DataAction extends ActionSupport { //biz接口的声明,用来调用bizIDataBiz idata;//这些对象set和get后,都会被hibernate自动放进request里private Integer daId;private String daName;private String daAge;private List<Datas> datas;private Datas data;private int nowPage = 1;private int pageSize = 5;private int pageCount;private int count;public int getCount() {return count;}public void setCount(int count) {this.count = count;}public int getNowPage() {return nowPage;}public void setNowPage(int nowPage) { this.nowPage = nowPage;}public int getPageSize() {return pageSize;}public void setPageSize(int pageSize) { this.pageSize = pageSize;}public int getPageCount() {return pageCount;}public void setPageCount(int pageCount) { this.pageCount = pageCount;}public List<Datas> getDatas() {return datas;}public void setDatas(List<Datas> datas) { this.datas = datas;}public IDataBiz getIdata() {return idata;}public Integer getDaId() {return daId;}public void setDaId(Integer daId) { this.daId = daId;}public String getDaName() {return daName;}public void setDaName(String daName) { this.daName = daName;}public String getDaAge() {return daAge;}public void setDaAge(String daAge) { this.daAge = daAge;}public void setIdata(IDataBiz idata) { this.idata = idata;}public String save(){System.out.println("save");data = new Datas();data.setDaAge(daAge);data.setDaName(daName);idata.save(data);System.out.println("保存成功");return"save";}public String delete(){System.out.println("delete");System.out.println(daId);data = new Datas(daId);idata.delete(data);return"delete";}public String update(){System.out.println("update");data = new Datas(daId,daName, daAge);idata.update(data);return"update";}public String findById(){System.out.println("findById");data= idata.findById(daId);daAge = data.getDaAge();daName = data.getDaName();daId = data.getDaId();return"findById";}public String find(){System.out.println("find");System.out.println(idata);datas = idata.find(pageSize,nowPage);count = idata.getCount();pageCount = idata.getPageCount(count,pageSize);for (Datas data : datas) {System.out.println(data.getDaAge() + " "+ data.getDaName());}return"find";}}第六步在applicationContext.xml添加biz和action的节点,进入注入代码如下:<?xml version="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:p="/schema/p"xsi:schemaLocation="/schema/bean s/schema/beans/spring-beans-3.0.xsd" ><bean id="dataSource"class="mons.dbcp.BasicDataSource"><property name="driverClassName"value="com.microsoft.sqlserver.jdbc.SQLServerDriver"> </property><property name="url" value="jdbc:sqlserver://localhost:1433"></property><property name="username"value="sa"></property> </bean><bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryB ean"><property name="dataSource"ref="dataSource"></property><property name="configLocation"value="classpath:hibernate.cfg.xml"></property></bean><bean id="datasDao" class="com.beijing.dao.DatasDAO"> <property name="sessionFactory"><ref bean="sessionFactory" /></property></bean><bean id="idata" class=".DataBiz"><property name="datasDao" ref="datasDao"></property> </bean><bean id="data" class="com.beijing.ac.DataAction"><property name="idata" ref="idata"></property> </bean></beans>第七步在struts.xml中添加action节点代码如下:<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "/dtds/struts-2.1.dtd"><struts><package name="test"extends="struts-default"><action name="data"class="com.beijing.ac.DataAction"><resultname="update"type="redirectAction">/Data_find.action</result> <resultname="findById">/update.jsp</result></action><action name="*_*"class="com.beijing.ac.{1}Action" method="{2}"><resultname="save"type="redirectAction">/Data_find.action</result> <resultname="delete"type="redirectAction">/Data_find.action</result> <resultname="find">/{2}.jsp</result></action></package></struts>注意:之所以用两个action,是想用不同的方法实现action的方法调用第八步find.jsp, ind ex.jsp, save.jsp, update.jsp的实现1 find.jsp代码如下:<%@page language="java"import="java.util.*"contentType="text/html; charset=gbk"%><%@taglib prefix="c"uri="/jsp/jstl/core"%> <%@taglib prefix="s"uri="/struts-tags"%><!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>My JSP 'index.jsp' starting page</title><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body>================================================<br>全查数据<table align="center"width="80%"><tr><th>年龄</th><th>姓名</th><th>编号</th><th>操作</th></tr><s:iterator value="datas"><tr onmouseover="this.bgColor='green'" onmouseout="this.bgColor='white'" align="center"><td><s:property value="daAge"/></td><td><s:property value="daName"/></td><td><s:property value="daId"/></td><td><ahref="${pageContext.request.contextPath}/Data_delete.action?daId= ${daId}">删除</a></td><td><a href="data!findById.action?daId=${daId}">修改</a></td></tr></s:iterator><tr></tr><tr align="center"><td>共<s:property value="pageCount"/>页</td><td><s:if test="%{nowPage==1}">首页&nbsp;上一页</s:if><s:else><ahref="${pageContext.request.contextPath}/Data_find.action?nowPage=1">首页</a>&nbsp;<ahref="${pageContext.request.contextPath}/Data_find.action?nowPage=${nowPage-1}">上一页</a>&nbsp;</s:else><s:if test="%{nowPage != pageCount}"><ahref="${pageContext.request.contextPath}/Data_find.action?nowPage=${nowPage+1}">下一页</a>&nbsp;<ahref="${pageContext.request.contextPath}/Data_find.action?nowPage=${pageCount}">末页</a>&nbsp;</s:if><s:else>下一页&nbsp;末页</s:else></td><td><ahref="${pageContext.request.contextPath}/save.jsp">新增</a></td> </tr></table></body></html>2 index.jsp 代码入戏<%@page language="java"import="java.util.*"contentType="text/html; charset=gbk"%><!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>My JSP 'index.jsp' starting page</title><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><script type="text/javascript">function indexFind(){document.location="${pageContext.request.contextPath}/Data_fin d.action";}</script><body onload="indexFind()">================================================<br>struts2+spring+hibernate的增删改查</body></html>3 save.jsp 代码如下<%@page language="java"import="java.util.*"contentType="text/html; charset=gbk"%><!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>My JSP 'index.jsp' starting page</title><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body>================================================<br> <div align="center"><form action="Data_save">姓名<input name="daName"type="text"><br>年龄<input name="daAge"type="text"><br>编号<input name="daId"type="text" readonly="readonly"><br><input type="submit"value="提交"></form></div></body></html>4 update.jsp 代码如下<%@page language="java"import="java.util.*"contentType="text/html; charset=gbk"%><%@taglib prefix="s"uri="/struts-tags"%><!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>My JSP 'index.jsp' starting page</title><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body>================================================<br><div align="center"><form action="Data_save">姓名<input value="${daName}"type="text"><br>年龄<input value="${daAge}"type="text"><br>编号<input value="${daId}"type="text" readonly="readonly"><br><input type="submit"value="提交"></form><s:form action="data!update.action"><s:textfield label="姓名"name="daName"/><br><s:textfield label="年龄"name="daAge"/><br><s:textfield label="编号"name="daId" readonly="true"/><br><s:submit value="提交"></s:submit></s:form></body></html>第九步启动tomcat如下图所示。

struts2环境搭建及详细示例

struts2环境搭建及详细示例

struts2环境搭建及详细示例suts2环境搭建 1.下载struts2框架下载地址/download.cgistruts223 2.创建web项目,导入用法struts2所必需的jar包。

创建web项目,在lib名目下添加必需的jar包。

所必需的jar包有 commons-upload-1.2.1.jar,commons-io-1.3.2.jar,commons-logging- api-1.1.jar,marker-2.3.16.jar,javassist-3.7.ga.jar,ognl-3.0.jar,struts2-core-2.2.1.1.jar,xwork-core-2.2.1.1.jar 注重:因为struts2版本的差异性,上面提到的包不一定满足全部版本的需求。

配置完struts2后,请部署运行一下。

按照运行时的错误提醒来添加jar 包解决问题。

比如,配置struts-2.2.1.1时需要commons-io-1.3.2.jar包和javassist-3.7.ga.jar包,但是2.1版本就不需要这两个包。

3.编写struts.xml文件 MyEclipse项目中的src 根名目下建立一个struts.xml文件。

(可以打开下载的struts2安装包里的apps名目下的随意一个jar包,在里面的 WEB_INFR/src名目下,寻觅struts.xml文件,将该文件复制进项目的src根名目下,将里面的内容清空(只留下标签和头部标签即可)) 4.在web.xml中加入struts2 MVC框架启动配置在struts2安装包里找到web.xml文件,将里面的和标签及其内容拷贝进项目中的web.config文件即可。

以上就是用Myeclips 搭配struts2的步骤,下边写一个容易的登录示例: struts2示例 1.创建login.jsp页面在body内创建一个fo表单。

form action="login.action" meth="post" username: input type="tt" name="username"/ br/ password: input type="text" name="password"/ br/ input type="bmit" value="submit" / /form 2.编写LoginAction.java package com.test.action;public class LoginAction { private String username; private String password; public String getUsername() { return username; }第1页共2页。

struts2教程(完全版)

struts2教程(完全版)

Yaio 4一、准备工作及实例 41.解压struts-2.1.6-all.zip 42.六个基本包 43.初识struts2配置文件 4(1).web.xml文件 4(2).struts.xml文件 4(3).struts.properties(参default.properties) 4 (4)struts-default.xml 5(5)其它配置文件 54.让MyEclipse提示xml信息 55.如何使用alt+/提示 56.实例 57.开启struts2自带的开发模式常量 78.vo传参模式 89.ModerDriven传参模式(不建议采用) 810.为什么要使用struts2代替struts1.x 9二、struts.xml配置及例程 91.配置文件的优先级 92.配置形式 93.package配置相关 104.分工合作include:指定多个配置文件 125.tomcat认证访问 126.初识拦截器 137.Action中的method属性 158.使用ForwardAction实现页面屏蔽。

178.使用default-Action配置统一访问 17小结Action 189.使用通配符 1810.使用0配置:ZERO Annotation 1911.Result配置详解 1912.异常处理 24三、在Action获取Scope对象 25方式一、与Servlet解耦合的非IOC方式 25方式二、与Servlet解耦合的IOC方式 27 方式三、与Servlet耦合的非IOC方式 27 方式四、与Servlet耦合的IOC方式 28四、OGNL与ValueStack(VS) 291.值栈入门 292.OGNL入门 313.普通方法访问 314.静态方法访问 315.默认类Math的访问 326.调用普通类的构造方法 327.集合对象初步 328.集合对象进阶 339.N语法top语法 3410.获取Stack Context中的信息 3511.总结$ # %的区别 3512.总结OGNL[重点] 35五、拦截器 361.概述strust2中的拦截器 362.自定义拦截器 37方式一,实现Interceptor接口。

LifeRay Portal 6学习笔记6使用Struts2开发Portlet

LifeRay Portal 6学习笔记6使用Struts2开发Portlet

准备Liferay版本:6.0.4开发模式:普通插件模式(非Ext)Struts版本:2.1.8.1环境使用到的Struts2相关jar包如下:antlr-2.7.2.jarcommons-fileupload-1.2.1.jar freemarker-2.3.15.jarognl-2.7.3.jarstruts2-core-2.1.8.1.jarstruts2-portlet-plugin-2.1.8.1.jar xwork-core-2.1.6.jar工程目录如下:参考内容参考Struts2自带的portlet示例struts2-portlet-2.1.8.1.war,在Struts 解压包下面的apps目录里面,这个示例是基于Pluto(/pluto/)Apache的Portal实现,但开发的都是portlet,所以可以参考这个。

开发示例代码portlet.xmlXml代码1.<portlet>2.<portlet-name>StrutsPortlet</portlet-name>3.<display-name>Struts Test Portlet</display-name>4.5.<portlet-class>org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher</portlet-class>6.7. <!--这里的name名字不能修改,value对应于Struts.xml文件里面的配置-->8.<init-param>9.<name>viewNamespace</name>10. <value>/strutsDemoView</value>11. </init-param>12.13. <!-- 对应Struts.xml中设置的默认action -->14. <init-param>15. <name>defaultViewAction</name>16. <value>index</value>17. </init-param>18.19. <init-param>20. <name>editNamespace</name>21. <value>/strutsDemoEdit</value>22. </init-param>23.24. <init-param>25. <name>defaultEditAction</name>26. <value>index</value>27. </init-param>28.29. <expiration-cache>0</expiration-cache>30.31. <!-- 支持view、edit,和前面的portlet一样 -->32. <supports>33. <mime-type>text/html</mime-type>34. <portlet-mode>view</portlet-mode>35. <portlet-mode>edit</portlet-mode>36. </supports>37.38. <portlet-info>39. <title>My StrutsPortlet portlet</title>40. <short-title>SP</short-title>41. <keywords>struts,portlet</keywords>42. </portlet-info>43. </portlet>liferay-portlet.xmlXml代码1.<portlet>2.<portlet-name>StrutsPortlet</portlet-name>3.<instanceable>true</instanceable>4.</portlet>liferay-display.xmlXml代码1.<portlet id="StrutsPortlet"></portlet>Struts.xmlXml代码1.<?xml version="1.0"encoding="UTF-8"?>2.<!DOCTYPE struts PUBLIC3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"4. "/dtds/struts-2.0.dtd">5.6.<struts>7.<package name="strutsDemoView"namespace="/strutsDemoView"extends="struts-portlet-default">8.<action name="index"method="view"class="org.huqiwen.study.StrutsDemo">9.<result name="success">/strutsDemoView/view.jsp</result>10. </action>11. <action name="portletView"method="portletView"class="org.huqiwen.study.StrutsDemo">12. <result name="view">/strutsDemoView/viewMode.jsp</result>13. </action>14. </package>15.16.17. <package name="strutsDemoEdit"namespace="/strutsDemoEdit"extends="struts-portlet-default">18. <action name="index"method="edit"class="org.huqiwen.study.StrutsDemo">19. <result name="success">/strutsDemoEdit/edit.jsp</result>20. </action>21. <action name="portleEdit"method="portletEdit"class="org.huqiwen.study.StrutsDemo">22. <result name="edit">/strutsDemoEdit/editMode.jsp</result>23. </action>24. </package>25.</struts>java文件Java代码1.import com.opensymphony.xwork2.ActionSupport;2.3.public class StrutsDemo extends ActionSupport {4.5. private static final long serialVersionUID = 1L;6.7. private String message;8.9. public String getMessage(){10. return message;11. }12. public void setMessage(String message){13. this.message=message;14. }15. public String view() throws Exception {16. message = "hello Struts2 View Portlet!";17. return SUCCESS;18. }19. public String portletView(){20. return "view";21. }22. public String edit() throws Exception {23. message = "hello Struts2 Edit Portlet!";24. return SUCCESS;25. }26. public String portletEdit(){27. return "edit";28. }29.}strutsDemoView/view.jspHtml代码1.<%@ page contentType="text/html;charset=utf-8"%>2.<%@ taglib prefix="s"uri="/struts-tags"%>3.<h2><s:property value="message"/></h2>4.<s:form action="portletView!portletView.action"method="post"namespace="view">5.<s:textfield label="名字"key="message"></s:textfield>6.<s:submit value="提交"></s:submit>7.</s:form>其他的JSP不写了,和普通的Strtus2开发一样。

Struts2详细实例教程

Struts2详细实例教程

Struts2(上)一、经典的MVC模式二、Struts1.x对MVC的实现三、Struts1.x的主要组件和作用组件作用ActionServlet 中央控制器Action 分控制器,调用JavaBean实现业务逻辑,Action可以分为Action、DispatchAction等不同类型ActionForm 封装参数,实现服务器验证,文件上传等Forward 转发到目的地,可以是JSP,也可以是另一个ActionStruts-config.xml 配置文件,配置有ActionForm,Action,Forward等,通过XML解析,然后使用反射技术使用该文件Struts标签库和JSTL类似,和Struts-config.xml、ActionForm、Action等对象可以紧密集成四、Struts1.x 开发实例-登录程序见案例。

五、Struts2(WebWork)的MVCStruts2的MVC架构六、Struts2的主要组件组件作用FilterDispatcher 起中央控制器作用的过滤器Action 处于Model层的Action,调用JavaBean实现业务逻辑struts.xml 核心配置文件,配置有Action、Result等result 和forward类似,转发的目的地,支持多种视图技术。

七、Struts2的实例-登录在MyEclipse环境中建立一个新的web工程,名称“Struts2Login”,存放路径“f:\Struts2Login”。

在Struts2.0.11版本中找到war包struts2-blank-2.0.11.war,解开该war包,在WEB-INF/lib 目录下复制出所有的jar包,这些jar包就是一个Struts2程序所需要的基础jar包,把它们复制到新建的web工程的WEB-INF/lib目录中。

在src目录下建立一个类,包名mypack,类名UserAction,其代码如下:package mypack;import com.opensymphony.xwork2.ActionSupport;public class UserAction extends ActionSupport {private String username;private String userpass;public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getUserpass() {return userpass;}public void setUserpass(String userpass) {erpass = userpass;}@Overridepublic String execute() throws Exception {if ("Mike".equals(username) && "123".equals(userpass)|| "张三".equals(username) && "abc".equals(userpass))return "success";elsereturn "error";}}在src目录下建立Struts2的配置文件struts.xml,内容如下:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><!-- 定义包管理配置的action 继承struts-default.xml中的配置 --><package name="actions" extends="struts-default"><!-- 定义Action(login.action) --><action name="login" class="erAction"><!-- 定义转发路径对应的字符串名 --><result name="success">/Success.jsp</result><result name="error">/Error.jsp</result></action></package></struts>修改web.xml,在其中加入一个过滤器,过滤/*路径。

Struts 2综合应用实例实验二

Struts 2综合应用实例实验二

实验二:Struts 2综合应用实例——添加学生信息实验要求:运用Struts 2框架,构建一个添加学生信息的项目。

界面如下:实验目的:通过构建一个添加学生信息项目,来综合应用Struts 2的知识点,包括标签、Struts 2配置等。

实验步骤:1. 建立数据库(MySQL)首先建立数据库XSCJ,建立学生表(XSB),表结构如下:相关sql语句:2. 建立Web项目打开MyEclipse,建立一个Web项目,命名为“Example_Struts”。

3. 加载Struts 2的基本类库建议从struts2-blank-2.0.14.war 的\WEB-INF\lib下拷贝,共五个jar包。

4. 修改web.xml5. 建立stu.jsp文件在项目的WebRoot文件夹下建立stu.jsp文件:<html><head><s:head /></head><body ><h3>添加学生信息</h3><s:form action="save.action" method="post" theme="simple"><table><tr><td>学号:</td><td><s:textfield name="xs.xh"></s:textfield></td></tr><tr><td>姓名:</td><td><s:textfield name="xs.xm" ></s:textfield></td></tr><tr><td>性别:</td><td><s:radio name="xs.xb" list="#{1:'男',0:'女'}" value="1"></s:radio></td></tr><tr><td>专业:</td><td><s:textfield name="xs.zy" label="专业"></s:textfield></td></tr><tr><td width="70">出生时间:</td><td><s:datetimepicker name="xs.cssj" id="cssj"displayFormat="yyyy-MM-dd" ></s:datetimepicker></td> </tr><tr><td> 备注:</td><td><s:textarea name="xs.bz" label="备注"></s:textarea></td></tr><tr><td><s:submit value="添加"></s:submit></td><td><s:reset value="重置"></s:reset></td></tr></table></s:form></body></html>6. 建立表对应的JavaBean和DBConn类在src文件夹下新建包“org.model”,在该包下建class文件,命名为“Xsb”,该类中有6个字段,分别为xh、xm、xb、zy、cssj和bz,并生成它们的getter和setter方法,代码如下://生成它们的getter和setter方法public String getXh() {return xh;}public void setXh(String xh) {this.xh = xh;}public String getXm() {return xm;}public void setXm(String xm) {this.xm = xm;}public byte getXb() {return xb;}public void setXb(byte xb) {this.xb = xb;}public String getZy() {return zy;}public void setZy(String zy) {this.zy = zy;}public Date getCssj() {return cssj;}public void setCssj(Date cssj) {this.cssj = cssj;}public String getBz() {return bz;}public void setBz(String bz) {this.bz = bz;}}注意,cssj为java.sql.Date类型。

Struts2综合应用案例

Struts2综合应用案例

7.2 增加验证的“登录”功能
在struts.xml中修改配置,代码如下:
… <struts>
<package name="default" extends="struts-default"> <!-- 用户登录 --> <action name="login" class="org.action.LoginAction"> <result name="admin">/admin.jsp</result> <result name="student">/student.jsp</result> <result name="error">/error.jsp</result> <result name="input">/login.jsp</result> </action> …//此处以后还要添加更多action配置
<table bgcolor="#71CABF" align="center"> <!-- 页面头部 --> <tr> <td colspan="2"><jsp:include page="head1.jsp"/></td> </tr> …
</table> </body> </html>
7.1.2 整体设计
2.页头部JSP (1)“管理员”身份登录的主页头head.jsp,代码为。 (2)7.1.2 整体设计

通过实例跟我学Struts2框架...

通过实例跟我学Struts2框架...

通过实例跟我学Struts2框架...1.1通过代码实例跟我学Struts2框架从入门到精通——如何将拦截器组件定义为某个包中的“全局(默认)拦截器”和“全局”的应用实例1、主要的目的当某个拦截器组件需要为多个不同的Action组件提供拦截功能时,为了能够减少在struts.xml文件中的重复引用方面的配置,可以将该拦截器组件配置成一个默认拦截器链中的成员拦截器组件—一也就是将该拦截器组件配置为某个包的默认拦截器链中的成员拦截器组件。

一旦在某个包下定义了默认拦截器链,在该包下所有的Action组件类都会自动使用此拦截器链。

当然,对于不希望应用这个拦截器链的Action组件类,开发人员可以将它的配置定义放置在其它包的定义之下(请参考前面的分包的技术实现)。

2、引用自定义的拦截器组件的配置定义示例(1)配置定义示例"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.1.dtd"><="" bdsfid="85" name="authorizedUserInterceptor" p=""> class="com.px1987.sshwebcrm.interceptor.AuthorizedUserInterc eptor" /> <="" bdsfid="88" name="logInfoInterceptor" p=""> class="com.px1987.sshwebcrm.interceptor.LogInfoInterceptor" /> /errorDeal/showNoLoginError.jsp/userManage/loginSuccess.jsp<="" bdsfid="113" method="doUpdateUser" name="updateUserInfo" p="">class ="erInfoAction" >/errorDeal/showNoLoginError.jsp<="" bdsfid="120" method="doDeleteUser" name="deleteUserInfo" p="">class ="erInfoAction" >/errorDeal/showNoLoginError.jsp/userManage/loginSuccess.jsp/userManage/loginSuccess.jsp<="" bdsfid="143" name="userInfoManageActionModel" p="">class="erInfoManageActionMo del" >/userManage/loginSuccess.jsp<="" bdsfid="150" class="erInfoAction"name="*userInfoAction" p="">method="{1}">/userManage/loginSuccess.jsp<="" bdsfid="156" class="erInfoAction"name="defaultActionName" p="">method="defaultActionMethod">/userManage/loginSuccess.jsp这是在struts.xml文件中为某个Action提供“注入的属性”值(2)对配置定义示例进行说明在上面所示的拦截器组件配置示例中,实现了将名称为userLoginInterceptor的拦截器组件定义为某个userInfoPackage包中的全局拦截器的配置方法。

struts2入门实例教程详解

struts2入门实例教程详解

Struts2教程教程1:在本教程中使用的工具和程序库的版本如下:在本系列教程中Web工程的上下文路径都是struts2,如果在Web根目录有一个index.jsp文件,则访问路径如下:http://localhost:8080/struts2/index.jsp由于MyEclipse6目前并不支持Struts2,所以我们需要到去下载Struts2安装包。

要想正常使用Struts2,至少需要如下五个包(可能会因为Struts2的版本不同,包名略有差异,但包名的前半部是一样的)。

struts2-core-2.0.11.1.jarxwork-2.0.4.jarcommons-logging-1.0.4.jarfreemarker-2.3.8.jarognl-2.6.11.jarStruts2虽然在大版本号上是第二个版本,但基本上在配置和使用上已经完全颠覆了Struts1.x的方式(当然,Struts2仍然是基于MVC模式的,也是动作驱动的,可能这是唯一没变的东西)。

Struts2实际上是在Webwork基础上构建起来的MVC框架。

我们从Struts2的源代码中可以看到,有很多都是直接使用的xwork(Webwork的核心技术)的包。

既然从技术上来说Struts2是全新的框架,那么就让我们来学习一下这个新的框架的使用方法。

如果大家使用过Struts1.x,应该对建立基于Struts1.x的Web程序的基本步骤非常清楚。

让我们先来回顾一下建立基于Struts1.x的Web程序的基本步骤。

1. 安装Struts。

由于Struts的入口点是ActionServlet,所以得在web.xml中配置一下这个Servlet。

2. 编写Action类(一般从org.apache.struts.action.Action类继承)。

3. 编写ActionForm类(一般从org.apache.struts.action.ActionForm类继承),这一步不是必须的,如果要接收客户端提交的数据,需要执行这一步。

i春秋实验--struts2远程命令执行S2-045漏洞利用与修复

i春秋实验--struts2远程命令执行S2-045漏洞利用与修复

i春秋实验--struts2远程命令执⾏S2-045漏洞利⽤与修复实验环境操作机:Windows XP⽬标机:CentOS 6.5实验⽬的了解S2-045 Struts2远程命令执⾏漏洞的危害掌握检测修复S2-045 Struts远程命令执⾏漏洞技术实验内容Apache Struts 2被曝存在远程命令执⾏漏洞,漏洞编号S2-045,CVE编号CVE-2017-5638,在使⽤基于Jakarta插件的⽂件上传功能时,有可能存在远程命令执⾏,导致系统被⿊客⼊侵。

恶意⽤户在上传⽂件时通过修改HTTP请求头中的Content-Type值来触发该漏洞,进⽽执⾏系统命令。

影响范围Struts 2.3.5 --Struts 2.3.31Struts 2.5 --Struts 2.5.10不受影响的范围Struts 2.3.32 Struts 2.5.10.1快速检测⽅式使⽤知道创宇SeeBug照妖镜可以直接检测该站点是否存在漏洞。

漏洞危害在default.properties⽂件中,struts.multipart.parser的值有两个选项分别是jakarta和pell。

其中的jakarta解析器是Struts 2框架的标准组成部分。

默认情况下jakarta是启⽤的,所以该漏洞的严重性需得到正视。

攻击者可以通过远程命令注⼊执⾏,另系统执⾏恶意命令,导致⿊客⼊侵,从⽽威胁服务器安全,影响极⼤。

实验步骤步骤⼀:验证漏洞打开cmd并切换⾄poc.exe所在⽬录,执⾏下列命令:poc.exe http://172.16.12.2/example/HelloWorld.action "ifconfig"成功执⾏,说明漏洞存在。

可以尝试其他命令:poc.exe http://172.16.12.2/example/HelloWorld.action "cat /etc/passwd"步骤⼆:修复漏洞修改Struts2的Multipart parser1,使⽤ssh登陆到⽬标主机172.16.12.2,⽤户名root,密码1234562,将struts2-core-2.3.31.jar(路径:/var/www/apache-tomcat-7.0.14/webapps/ROOT/WEB-INT/lib/)下载到桌⾯,修改⽂件扩展名为struts2-core-2.3.31.zip,解压并打开⽂件夹org\apache\struts2。

struts2简单示例

struts2简单示例

struts2简单⽰例今天写⼀个struts2的例⼦,⽬的是为了让⼤家明⽩struts2的基本流程,其实框架没有⼤家想象的那么难,说⽩了struts2的本质就是⼀个⼤的Servlet,即原本需要提交到Servlet处理的部分现在通过配置⽂件将其交给普通的Class类进⾏处理。

⾸先新建⼀个javaWeb项⽬,然后把struts2所依赖的包导⼊到lib下(可以百度⼀下也可以直接到官⽹上下载),然后在web.xml中对struts2进⾏配置,添加的内容如下:1<filter>2<filter-name>struts2</filter-name>3<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>4</filter>5<filter-mapping>6<filter-name>struts2</filter-name>7<url-pattern>/*</url-pattern>8</filter-mapping>在index.jsp中写如下代码:1<form method="post" action="testAction">2名称:<input type="text" name="name"/>3<input type="submit" value="提交"/>4</form>接下来是写struts的配置⽂件struts.xml,内容如下:1<?xml version="1.0" encoding="UTF-8" ?>2<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"3 "/dtds/struts-2.1.dtd">4<struts>5<package name="testaction" namespace="/" extends="struts-default">6<action name="testAction" class="com.struts.action.TestAction">7<result name="success">/success.jsp</result>8<result name="error">/index.jsp</result>9</action>10</package>11</struts>其中⼀个action对应⼀个响应,在index.jsp中action="testAction"所以此处action的name="testAction"这是⼀⼀对应的关系。

通过实例跟我学Struts2框架从入门到精通——如何校验Struts2框架中的Action类中的某个自定义方法的应用实例

通过实例跟我学Struts2框架从入门到精通——如何校验Struts2框架中的Action类中的某个自定义方法的应用实例

1.1通过代码实例跟我学Struts2框架从入门到精通——如何校验Struts2框架中的Action类中的某个自定义方法的应用实例1.1.1校验Struts2框架中的Action类中的某个自定义方法的应用实例如果我们重写了validate方法,则该方法会应用于此Action中的所有提供服务的业务方法。

Struts2也支持校验特定方法的validateXxx()方法。

其中的“XXX”代表Action类中的方法名称。

因为validate()方法会处理Action类中的所有逻辑方法。

而如果只需要对其中的单个或者部分逻辑方法进行验证,那么就需要重写validateXxx()方法。

validateXxx()使用了反射,相对来说性能稍差,而validate()则是通过接口com.opensymphony.xwork2.Validateable调用。

1、在Action类中增加另一个自定义的方法doUserLogin2、再添加doUserRegister方法,其中的代码与doUserLogin()代码相同public String doUserRegister(){ //在该方法中进行用户注册的功能实现boolean returnResult=getUserName().equals("yang1234")&&getUserPassWord().equals("12345678");if(returnResult){oneUserInfo=new UserInfoActionForm();oneUserInfo.setUserName(userName);oneUserInfo.setUserPassWord(userPassWord);HttpSession session=ServletActionContext.getRequest().getSession();session.setAttribute("oneUserInfo", oneUserInfo);resultMessage =getUserName()+" "+ this.getText("strutsweb.login.success");}else{resultMessage =getUserName()+" "+ this.getText("strutsweb.login.failure");// resultMessage =getUserName()+" "+ this.getText("strutsweb.login.actionpackage.failure");}return this.SUCCESS;}3、在userLoginI18n.jsp页面中指示该方法的名称<formaction="${pageContext.request.contextPath}/i18nUserInfoManageActionModel!doUse rLogin.action" method="post" >或者<formaction="${pageContext.request.contextPath}/i18nUserInfoManageActionModel! doUserRegister.action" method="post" >4、将Action类中的validate()方法改名为validate DoUserLogin()(注意:其中的doUserLogin中的“d”要大写)最终的代码如下:package com.px1987.sshwebcrm.action;import javax.servlet.http.HttpSession;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;import erInfoActionForm;public class I18nUserInfoManageActionModel extends ActionSupport { private String userName=null;private String userPassWord=null;private String verifyCodeDigit=null;private int type_User_Admin;private String resultMessage;private UserInfoActionForm oneUserInfo=null;public I18nUserInfoManageActionModel() {}public String getResultMessage() {return resultMessage;}public void setResultMessage(String resultMessage) {this.resultMessage = resultMessage;}public String execute(){ //在该方法中进行用户登陆的功能实现boolean returnResult=getUserName().equals("yang1234") &&getUserPassWord().equals("12345678");if(returnResult){oneUserInfo=new UserInfoActionForm();oneUserInfo.setUserName(userName);oneUserInfo.setUserPassWord(userPassWord);HttpSession session=ServletActionContext.getRequest().getSession();session.setAttribute("oneUserInfo", oneUserInfo);resultMessage =getUserName()+" "+ this.getText("strutsweb.login.success");}else{resultMessage =getUserName()+" "+ this.getText("strutsweb.login.failure");}return this.SUCCESS;}public String doUserLogin(){ //在该方法中进行用户登陆的功能实现boolean returnResult=getUserName().equals("yang1234") &&getUserPassWord().equals("12345678");if(returnResult){oneUserInfo=new UserInfoActionForm();oneUserInfo.setUserName(userName);oneUserInfo.setUserPassWord(userPassWord);HttpSession session=ServletActionContext.getRequest().getSession();session.setAttribute("oneUserInfo", oneUserInfo);resultMessage =getUserName()+" "+ this.getText("strutsweb.login.success");}else{resultMessage =getUserName()+" "+ this.getText("strutsweb.login.failure");}return this.SUCCESS;}public String doUserRegister(){ //在该方法中进行用户注册的功能实现boolean returnResult=getUserName().equals("yang1234") &&getUserPassWord().equals("12345678");if(returnResult){oneUserInfo=new UserInfoActionForm();oneUserInfo.setUserName(userName);oneUserInfo.setUserPassWord(userPassWord);HttpSession session=ServletActionContext.getRequest().getSession();session.setAttribute("oneUserInfo", oneUserInfo);resultMessage =getUserName()+" "+ this.getText("strutsweb.login.success");}else{resultMessage =getUserName()+" "+ this.getText("strutsweb.login.failure");}return this.SUCCESS;}public void validate DoUserLogin() { //它能够验证 doUserLogin() if(getUserName()==null||getUserName().equals("")){addFieldError("erName",getText("erName.required"));}if(getUserPassWord()==null||getUserPassWord().equals("")){addFieldError("erPassWord",getText("erPassWord.required"));}if(getUserPassWord().length() <4){addFieldError("userPassWord.length",getText("erPassWord.length"));}}public void validate DoUserRegister() { //它能够验证 doUserRegister() if(getUserName()==null||getUserName().equals("")){addFieldError("erName",getText("erName.required"));}if(getUserPassWord()==null||getUserPassWord().equals("")){ addFieldError("erPassWord",getText("erPassWord.required"));}if(getUserPassWord().length() <4){addFieldError("userPassWord.length",getText("erPassWord.length"));}}public String getUserName() {return userName;}public void setUserName(String userName) {erName = userName;}public String getUserPassWord() {return userPassWord;}public void setUserPassWord(String userPassWord) {erPassWord = userPassWord;}public String getVerifyCodeDigit() {return verifyCodeDigit;}public void setVerifyCodeDigit(String verifyCodeDigit) {this.verifyCodeDigit = verifyCodeDigit;}public int getType_User_Admin() {return type_User_Admin;}public void setType_User_Admin(int type_User_Admin) {this.type_User_Admin = type_User_Admin;}}4、再测试其效果 http://127.0.0.1:8080/sshwebcrm/userManage/userLoginI18n.jsp保证其中的请求是向doUserLogin方法请求<formaction="${pageContext.request.contextPath}/i18nUserInfoManageActionModel!doUse rLogin.action" method="post" >也可以将execute方法删除仍然会出现上面的错误!模拟用户注册功能<formaction="${pageContext.request.contextPath}/userInfoAction!doUserRegister.actio n" method="post" >然后再进行测试该方法的主要缺点——不灵活!比如对验证的要求发生变化(增加对新的数据的检查),此时必须修改验证程序!使得“验证程序”和对应的“表单”紧密关联。

通过实例跟我学Struts2从入门到精通——在Struts2框架的Web应用项目中应用拦截器栈(组)以简化系统的配置

通过实例跟我学Struts2从入门到精通——在Struts2框架的Web应用项目中应用拦截器栈(组)以简化系统的配置

1.1通过代码实例跟我学Struts2框架从入门到精通——在Struts2框架的Web应用项目中应用拦截器栈(组)以简化系统的配置1.1.1Struts2框架中的拦截器栈(组)1、修改struts.xml配置文件为下面的状态<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.1.dtd"><struts><include file="struts-default.xml"/><package name ="userInfoPackage" extends ="struts-default" ><interceptors><interceptor name ="authorizedUserInterceptor"class="com.px1987.sshwebcrm.interceptor.AuthorizedUserInterceptor" /><interceptor name ="logInfoInterceptor"class ="com.px1987.sshwebcrm.interceptor.LogInfoInterceptor" /> <interceptor-stack name ="SSHWebAppStack"><interceptor-ref name ="authorizedUserInterceptor" /><interceptor-ref name ="timer" /><interceptor-ref name ="defaultStack" /></interceptor-stack></interceptors ><default-action-ref name="defaultActionName" /><action name ="userInfoAction" class ="erInfoAction" ><result name="success">/userManage/loginSuccess.jsp</result></action><action name ="userInfoManageActionModel"class="erInfoManageActionModel" ><result name="success">/userManage/loginSuccess.jsp</result><interceptor-ref name ="logInfoInterceptor" /><interceptor-ref name ="defaultStack" /></action><action method="doUpdateUser" name ="updateUserInfo"class ="erInfoAction" > <result name="success">/userManage/loginSuccess.jsp</result><result name="login">/errorDeal/showNoLoginError.jsp</result><interceptor-ref name ="SSHWebAppStack" /></action><action method="doDeleteUser" name ="deleteUserInfo"class ="erInfoAction" > <result name="success">/userManage/loginSuccess.jsp</result><result name="login">/errorDeal/showNoLoginError.jsp</result><interceptor-ref name ="SSHWebAppStack" /></action><action name ="*userInfoAction" class ="erInfoAction"method="{1}"><result name="success">/userManage/loginSuccess.jsp</result></action><action name ="defaultActionName" class ="erInfoAction"method="defaultActionMethod"><result name="success">/userManage/loginSuccess.jsp</result><param name="resultMessage">这是在struts.xml文件中为某个Action提供“注入的属性”值</param></action></package></struts>2、再测试该拦截器栈的效果1.1.2在项目的struts.xml配置文件中应用package包进行分组和隔离1、修改struts.xml配置文件以定义两个不同的包(1)需要拦截器的包配置定义示例<package name ="userInfoInterceptorPackage" extends ="struts-default" ><interceptors><interceptor name ="authorizedUserInterceptor"class="com.px1987.sshwebcrm.interceptor.AuthorizedUserInterceptor" /> <interceptor name ="logInfoInterceptor"class="com.px1987.sshwebcrm.interceptor.LogInfoInterceptor" /><interceptor-stack name ="SSHWebAppStack"><interceptor-ref name ="authorizedUserInterceptor" /><interceptor-ref name ="logInfoInterceptor" /><interceptor-ref name ="defaultStack" /><interceptor-ref name ="timer" /></interceptor-stack></interceptors ><action method="doUpdateUser" name ="updateUserInfo"class ="erInfoAction" > <result name="success">/userManage/loginSuccess.jsp</result><result name="login">/errorDeal/showNoLoginError.jsp</result><interceptor-ref name ="SSHWebAppStack" /></action><action method="doDeleteUser" name ="deleteUserInfo"class ="erInfoAction" > <result name="success">/userManage/loginSuccess.jsp</result><result name="login">/errorDeal/showNoLoginError.jsp</result><interceptor-ref name ="SSHWebAppStack" /></action></package>(2)不需要拦截器的包配置定义示例<package name ="userInfoPackage" extends ="struts-default" ><default-action-ref name="defaultActionName" /><action name ="userInfoAction" class ="erInfoAction" ><result name="success">/userManage/loginSuccess.jsp</result></action><action name ="userInfoManageActionModel"class="erInfoManageActionModel" ><result name="success">/userManage/loginSuccess.jsp</result></action><action name ="*userInfoAction" class ="erInfoAction"method="{1}"><result name="success">/userManage/loginSuccess.jsp</result></action><action name ="defaultActionName" class ="erInfoAction"method="defaultActionMethod"><result name="success">/userManage/loginSuccess.jsp</result><param name="resultMessage">这是在struts.xml文件中为某个Action提供“注入的属性”值</param></action></package>2、再测试本示例的测试页面(1)首先观察tomcat在启动时是否出现错误(2)再次进行系统登陆、并再执行http://192.168.1.66:8080/sshwebcrm/updateUserInfo.action(3)或者http://127.0.0.1:8080/sshwebcrm/my.action现在大家应该对struts.xml中的<package>标签——“逻辑上分组”的含义和应用有所体验!。

struts2例子三【Action】整理文

struts2例子三【Action】整理文

struts2例⼦三【Action】整理⽂Action 的配置是 Struts2 框架的⼀个基础⼯作单元,每⼀个 Action 的配置都有对应的处理类,当⼀个请求和 Action 的 name 相匹配时,框架将根据所配置的 Action 映射来决定对请求的处理。

1、Action 映射配置在 Action 映射中可以指定 result types 、异常处理器( exception handlers )及拦截器,但是,只有Action 的 name 属性是必需指定的,其他属性也可以在 package 范围内进⾏定义,供该 package 下配置的所有 Action 引⽤。

如:<action name="Logon" class="tutorial.Logon"><result name="input">Logon.jsp</result></action>2、Action 名称及命名注意:如果在你的 action 的 name 中包含有斜线(如: <action name="xxxxxx/xxxxxx" class="xxxxxx.xxxxx"/> ),你需要在 struts.xml 中进⾏如下配置: <constant name="struts.enable.SlashesInActionNames" value="true"/> ,但是,启⽤该配置也会产⽣⼀些副作⽤。

具体-。

-问度娘警告:谨慎使⽤在 action 名称中包含点 (er) 、斜线 (create/user) 和横线 (create-user) 的情况,虽然 action 的名称定义⾮常灵活,但是,当在 action 的 name 中使⽤点、斜线或横线时,应该谨慎。

struts2 实验报告

struts2 实验报告

1.系统分析与设计1.1系统功能描述本系统是个非常简单的注册、登录系统。

本系统的实现是基于Struts2、Spring、Hibernate三个框架,系统功能单一,业务逻辑简单。

当用户注册信用户时,就是向系统中增加一个新用户,对应的数据库增加一条记录。

当用户输入注册信息时,系统提供了基本的输入验证判断用户输入是否合法,只有当用户输入满足基本输入要求时,才会被提交到实际的登录系统,进行实际的登录处理。

系统还使用了随机产生的图形验证码来防止刷新,防止用户通过单击浏览器的书安心按钮来重复注册多个用户。

系统还提供了一种Ajax方式来验证用户输入的注册名是否有效,系统要求所有的用户名不能重复。

故当用户输完用户名后,系统立即在页面上方提示用户该用户名是否可用,如果系统中没有该用户名,则系统提示该用户名可用;否则提示用户该用户名重复,用户必须重新选择用户名注册。

当用户注册一个新用户名之后,就可以使用系统的登录功能来登录系统了,用户输入登录用的用户名、密码后,系统一样提供了基本的输入校验。

除此之外,系统还采用了随机产生图形验证码来防止恶意用户的暴力破解,系统随机生成一个图形验证码,而用户登录必须输入图形验证码中显示的字符串,只有用户输入的字符串和系统随机生成的验证码字符相同时,系统才允许用户登录。

1.2系统功能流程处理用户注册的流程图东北大学软件学院实践考核类课程(四)实验报告1.3数据库设计ColumnNarneDatatppe HOTH ULLAUTOI NC :FlagsDefaultValue Commentuser_id|S>INT(11)✓ ✓_|UNSIGNED _|ZEROFELLEBBQ username 心.VARCH.4.R(50]_|BINARYQ user_pass VARCHAR(50] ✓_|BIN4RYQ emailVARCHAR(100]1BIN4RY相关的映射文件:<hibernate-mapping package ="org.reg_login.model"><class name ="User"table ="usertable"〉<id name ="id"column ="user_id"><generator class ="identity"/> </id ><property name ="user"column ="user_name"not-null ="true"length ="50"unique ="true"/><property name ="pass"column ="userpass"n ot-null ="true"C=3length ="50"/><property name ="email"length ="100"/></class></hibernate-mapping >一旦提供了上面的映射文件,Hibernate 就可以理解User 和user_table 之间的对应关系。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录一.Liferay,ext开发环境的搭建 (1)二.集成struts2 (3)1.依赖包: (3)2.使用Struts2 (3)三.使用Hibernate. Spring (4)1.建立bean (4)2.建立事务层: (5)3 .建立持久层 (8)4. Action 中调用事务层 (10)三.将portlet注册到portal (11)四.加入国际化 (13)五.加入处理页面 (13)2010年12月20日,修改在页面上的标签找不到国际化信息。

一.Liferay,ext开发环境的搭建1.进入myeclipse,修改liferay-portal-src-5.2.3文件名为portal。

导入portal到eclipse.2.展开portal工程目录,我们可看到一个release.properties文件,新建一个它的扩展配置文件,文件名为release.${username}.properties。

${username}是计算机当前用户名我文件名是release.Administrator.properties,文件内容只一行:lp.ext.dir=D:\myspace\ext 即扩展工程放置路径。

3.打开myeclipse里面ant视图(window--> show view --> ant) , 在ant视图中,点击添加,选择:\portalspace\portal\目录下build.xml顺序执行clean ,start ,build-ext4.将liferay-portal-tomcat-6.0-5.2.3.zip解压到D:\portalspace\目录下,并更名为servers。

在D:\portalspace\ext目录下我们可以看到app.server.properties文件,同样我们也要建立一个扩展配置文件app.server.${username}.properties,文件内容两行:lp.ext.dir=D:/myspace/extapp.server.type=tomcatapp.server.tomcat.dir=D:/ myspace /servers/tomcat-6.0.185.将myspace/ext 工程导入到eclipse中。

6.打开window --> preference --> myeclipse --> application servers 将其他应用服务器disabble掉,找到tomcat6,将tomcat home diretory 指向D:\myspace\servers\tomcat-6.0.18,展开tomcat6,JDK选择我们配置好的JDK1.5+,JDK选项下面optional java vm argument输入如下内容:-Xms128m-Xmx256m-XX:MaxPermSize=128m7.建立数据库lportal 。

在D:\myspace\ext\ext-impl\src\portal-ext.properties文件中添加数据库连接信息# MySQLjdbc.default.driverClassName=com.mysql.jdbc.Driverjdbc.default.url=jdbc:mysql://localhost:3306/lportalername=rootjdbc.default.password=roothibernate.dialect=org.hibernate.dialect.MySQLDialect若不添加以上内容liferay就会使用自带默认数据库.8.选择 :\myspace\ext\目录下build.xml 顺序执行clean,deploy 将ext项目部署到tomcat-6.0.18. 然后选择eclipse中的tomcat6.0启动即可9.在浏览器里输入http://localhost:8080/可以看到portal系统了。

输入emal:test@ password: test登录二.集成struts21.依赖包:除以上包以外还需要加入struts2-portlet-plugin-2.1.8.1.jar准备好以上依赖包之后,将它们放到ext/ext-lib/portal/下。

然后选择project→properties→ java build path→ Libraries→add jar→选中刚才加入的包确认。

2.使用Struts2在ext-impl/src 目录下新建struts.xml,事例如下:<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><package name="edit"extends="struts-portlet-default"namespace="/edit"><action name="submit"class="com.softcreate.portlet.car.action.SubmitCarAction"method="getParam"><result name="success">/html/portlet/test/view.jsp</result> </action></package></struts>除了extends=”struts-portlet-default”不同之外,其它配置与平常配置一样,编写好自己的action类即完成struts2的集成。

不需要在web.xml中加入监听三.使用Hibernate. Spring1.建立bean找到ext/ext-service/src新建包:com.softcreate.portlet.car.model新建类Car.java 内容如下:public class Car {private String id;private String name;private String number;private String date;private String userId;private String addtext;private Integer isAble;private Integer isUsed;private String dept;setter() , getter() …}找到 ext/ext-impl/src/META-INF新建car-hbm.xml 内容如下:<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""/hibernate-mapping-3.0.dtd"> <hibernate-mapping><class name="com.softcreate.portlet.car.model.Car"table="oa_t_car_detail"><id name="id"type="ng.String"><column name="id"length="100"/><generator class="assigned"/></id><property name="name"type="ng.String"><column name="name_"length="100"/></property><property name="number"type="ng.String"><column name="number_"length="100"/></property><property name="date"type="ng.String"><column name="date_"length="100"/></property><property name="userId"type="ng.String"> <column name="user_id"length="100"/></property><property name="addtext"type="ng.String"> <column name="addtext"length="500"/></property><property name="isAble"type="ng.Integer"> <column name="is_able"/></property><property name="isUsed"type="ng.Integer"> <column name="is_used"/></property><property name="dept"type="ng.String"><column name="dept"length="100"/></property></class></hibernate-mapping>2.建立事务层:找到ext/ext-service/src新建包:com.softcreate.portlet.car.service 在包下新建接口:CarService.java,内容如下:package com.softcreate.portlet.car.service;import java.util.List;import com.liferay.portal.PortalException;import com.liferay.portal.SystemException;import com.liferay.portal.kernel.annotation.Isolation;import com.liferay.portal.kernel.annotation.Transactional;@Transactional(isolation = Isolation.PORTAL, rollbackFor = {PortalException.class, SystemException.class })public interface CarEntryService {public List findAll() throws SystemException;}在此包下新建工具类:CarServiceUtil, 内容如下:package com.softcreate.portlet.car.service;public class CarServiceUtil {private static CarService _service;public static CarService getService() {if (_service == null) {throw new RuntimeException("CarService is not set");}return_service;}public void setService(CarService service) {_service = service;}}找到ext/ext-impl/src,新建包com.softcreate.portlet.car.service.base,内容如下,新建CarServiceBaseImpl:package com.softcreate.portlet.car.service.base;import java.util.List;import com.liferay.portal.SystemException;import com.liferay.portal.kernel.annotation.BeanReference;import com.liferay.portal.service.base.PrincipalBean;import com.liferay.portal.util.PortalUtil;import com.softcreate.portlet.car.service.CarService;import com.softcreate.portlet.car.service.persistence.CarEntryPersistence;public abstract class CarServiceBaseImpl extends PrincipalBean implementsCarService {// name中的内容为spring中配置的bean id/*以下为ext-spring.xml 加入的信息。

相关文档
最新文档