搜档网
当前位置:搜档网 › struts2源码解析

struts2源码解析

struts2源码解析
struts2源码解析

一、ActionContext解析: (1)

二、ValueStack解析: (5)

三、ActionContext和ValueStack: (6)

四、ActionProxy (10)

五、ActionInvocation (11)

六、resulttype (13)

1、chain (13)

2、json (14)

七、struts2 tag和ognl (17)

一、ActionContext解析:

public static ActionContext getContext() :

获得当前Action的ActionContext实例

public Object get(Object key) :

此方法类似 HttpServletRequest.getAttribute(String name)

这种说法是错误的:

原因可查看Dispatcher.createContextMap()参数多的那个方法

public void put(Object key, Object value) :

此方法类似HttpServletRequest setAttribute(String name, Object o)。

这种说法是错误的:

public Map getParameters() :

获取所有的请求参数。类似于HttpServletRequest.getParameterMap() 方法。

调用了public Object get(Object key) 如下

{return get(ActionContext. PARAMETERS);}

public Map getSession() :

返回一个Map对象,该Map对象模拟了HttpSession实例。

调用了public Object get(Object key) 如下

{return get(ActionContext.SEESION);}

public void setSession(Map session) :程序员一般不调用没有意义

直接传入一个Map实例,将该Map实例里的key-value对转换成session的属性名

-属性值对。

public Map getApplication() :

返回一个Map对象,该对象模拟了该应用的ServletContext实例。

调用了public Object get(Object key) 如下

{return get(ActionContext. APPLICATION);}

public void setApplication(Map application) :程序员一般不调用没有意义

直接传入一个Map实例,将该Map实例里的key-value对转换成application的属性

名-属性值对。

Public getValueStack():

返回ValueStack

调用了public Object get(Object key) 如下

{return get(ActionContext. VALUE_STACK);}

如果想获取servletAPI有如下方法(查看Dispatcher.createContextMap()参数多的那个方法) 1:实现ServletRequestAware 然后从request中获取session和servletContext 实现ServletResponseAware 获取respose

2:ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST)//request

ActionContext.getContext().get(StrutsStatics. HTTP_RESPONSE)//response

ActionContext.getContext().get(StrutsStatics. SERVLET_CONTEXT)// servletContext

而sesion就可以通过request获得

而获取他们的map形式可用以下方法

ActionContext.getContext().get(“request”); //requestMap(封装了httprequest) ActionContext 中没有直接获取requestMap的方法

ActionContext.getContext().get(“session”); //sessionMap(封装了httpsession)

和ActionContext .getSession()等效

ActionContext.getContext().get(“application”); //applicationMap(封装servletContext) 和ActionContext .getApplication()等效

ActionContext.getContext().get(“parameters”);//封装了所有的请求参数

和ActionContext . getParameters ()等效

Struts2 中通过ActionContext来访问Servlet API,让Action彻底从Servlet API 中分离出来,最大的好处就是可以脱离Web容器测试Action。

那么struts是如何做到的呢?

查看struts2的StrutsPrepareAndExecuteFilter.dofilter()

不难发现prepare.createActionContext(request, response);就是创建ActionContext的地方

跟进该方法

继续跟进dispatcher.createContextMap()

继续跟进createContextMap()(上图中第四个红圈)

以下是RequestMap片段

这就是ActionContext中获得的虽然是Map却能操作request,session等对象的原因二、ValueStack解析:

ValueStack:虚拟对象

当strtus2接受请求时,他会立即创建一个ActionContext,ValueStack和一个Action对象。作为数据的载体,Action对象首先被迅速压入ValueStack以被他的属性可通过OGNL访问到, 然后是模型对象(如果实现了ModelDriver接口),再次就是用户调用valuestack.set()压入的自定义对象

OGNL表达式可以解析对象集合中的任何一个。V alueStack只是这些对象中的一个,也是默认的。OGNL表达式可以从中选择哪个对象来解析的更大范围的对象集合被称为ActionContext

/*实际调用findValue(),当知道返回结果一定为String时可调用此方法*/

public String findString(String expr);

/*

如果不以“#“打头则从valuestack中查找,

如果堆栈中找不到,则到ActionContext.context中查找(就是

ActionContext.getContext().get(“”))还没有就返回null

如果以“#“打头则从ActionContext的内置对象中找

如:

findValue(“#parameters”) //parameters map

findValue(“#request”)// request map

findValue(“#session”)// session map

findValue(“#application”)// application map

findValue(“#attr”)// attributeMap

AttributeMap.get()先从requestMap中找如果找不到则从sessionMap中找如果还找不

到则从applicationMap中找,范围依次从小到大找如下图

ognl表达式其实就是通过调用这个方法实现的

**/

public Object findValue(String expr);

/*

新建一个 bean 并设置属性expr和值value 压入栈顶

这个新建的bean内部实现我推测估计是个map

通常我们的bean并不意味着标准javaBean。这些bean并不具有好的javaBean形式.

可以是任何java对象

*/

public void set (String expr, Object value);

/*取到栈顶的bean,然后设置其属性expr的值为value*/

public void setValue(String expr, Object value);

public Object peek();

public Object pop();

public void push(Object o);

三、ActionContext和ValueStack:

ValueStack.getContext()==ActionContext.content(同一个Map) 如下:

而且valueStack.getContext()中返回的this.context(map)中同样包含了valuestack对象

因为:在onglValueStack的构造函数中会执行如下操作

Strtus2把valuestack放在request(setArribute())中、创建ActionProxy代理等操作都从这个方法开始Dispatcher.serviceAction(): 查看Dispatcher.serviceAction()如下:

当访问一个action的时候,此时struts2会把整个action压入valuestack的顶部(查看第四节ActionInvocation)

statuts2中valuestack的实现类是ognlValueStack 结构如下:

valuestack中的root就是模仿栈操作,有push(),peek(),pop()方法,其实他通过包装list 实现的,并且还继承了list.所以有 list和stack的双特性。每次请求访问的action都被放在root中.

从上图我们可以看出创建一个valuestack 有两种方式:

1 用一个已经存在的valuestack的root创建一个新的valuestack

2 完全新建一个valuestack

但无论哪种方式,context(也就是ActionContext)都是重新创建

结合下图可以得出:

1、valuestack :

如果是转发(reqeust.forward,其实ServletDispatcherResult就是直接转发请求的,结果资源可以是jsp/静态资源或者 action的url,只不过转发后由于struts2过滤器的配置前者不走struts,后者走strtus2的过滤器)会用老的valuestack.root创建一个新的,由于老的valuestack.root中有上一个action,所以新的valuestack中也有,而后的action也会被压入栈顶,

如果是新的请求则是一个完全新的valuestack

如果结果类型为chain:由于不重新走struts2的过滤器了,valuestack也不会重建,后面的action也会被压入栈顶。

2、ActionContext:

但无论是转发还是新请求,ActionContext都会被重置,也就是说如果你再某个action 中做了如下操作:ActionContext.getContext().put(“test”,”test”),然后转发给了另一个action则在第二个action中拿不到test 因为被重置了。只能拿到request等一些http对象,用户自己塞得都不存在了,一般我们也不会直接

ActionContext.getContext().put();因为这样做也没什么意义,直接根据需求把变量放在http对象中就可以了

如果结果类型为chain,由于不重新走struts2的过滤器了,ActionContext不会被重置

四、ActionProxy

ActionProxy API

public String getNamespace() //获取将要执行action的命名空间

public ActionInvocation getInvocation()/获取ActionInvocation

public ActionConfig getConfig()//获取action的配置信息

public String getActionName()获取将要执行action的命字

public Object getAction()获取将要执行action

代理Action的excute会调用invocation.invoke()该方法会调用所有拦截器并在最后调用业务action

五、ActionInvocation

Action的调度管理器

保存了将要调用的action和调用action之前的所有拦截器的链表并依次调用所有拦截器然后调用action 然后执行result 再然后倒序从各个拦截器中出来

ActionInvocation API:

Object getAction();

ActionContext getInvocationContext()://其实就是ActionContext.getContext();

Boolean isExecuted();//action是否执行过了

ActionProxy getProxy();

Result getResult();

Result getResult();

ValueStack getStack();

六、resulttype

1、chain

Action的返回结果类型为”chain”,表明返回结果为action链。

所谓的action链无非就是运行完action后不是返回某个视图资源,而是执行另一个action 如果第二个action返回结果仍然是chain 则继续下一个action 直至最后一个返回视图资源的action,最后一个action将返回给浏览器某个视图资源。

redirectAction 是重定向到某个action。

chain其实就相当于转发给某个action。

可查看ServletActionRedirectResult的excute()方法

2、json

需要使用jsonplugin.Jar包放入Web-INF/lib目录下.查看该包的sturts-plugin.xml文件如下:

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"https://www.sodocs.net/doc/2810636796.html,/dtds/struts-2.0.dtd">

而且要使包含返回结果类型为json的action所在的package必须继承”json-default”。

或者不继承”json-default”,而把sturts-plugin.xml中

的直接拷贝到当前struts.xml 然后在action的result中直接配置

ongl expression JSON插件将HTTP响应(Response)的MIME类型设为“application/json”。

root properties

如果 中不配置result 会把action做为根,把action中的所有属性都转换为json串返回给客户端

如:{action.property1:value1,action.property2:value2,……}

如果配置了 result ,则会把root指定的对象的属性(result)做为根生成json串;root参数值是一个ognl表达式!从valuestack中查找此值

如:{ rootObj.property1:value1, rootObj.property2:value2,……}

对应js:

jQuery.post(url, data, function(rs) {})中

rs对象中的所有属性就是action中的所有属性

如果指定了root rs对象中的所有属性就是root对应对象中的所有属性

Excluding properties

A comma-delimited list of regular expressions can be passed to the JSON Result and Interceptor, properties matching any of these regular expressions will be ignored on the serialization process:

login.password,

studentList.*\.sin

true

login.password,

studentList.*\.sin

Including properties

A comma-delimited list of regular expressions can be passed to the JSON Result to restrict which properties will be serialized. ONLY properties matching any of these regular expressions will be included in the serialized output.

Note

Exclude property expressions take precedence over include property

expressions. That is, if you use include and exclude property expressions on the same result, include property expressions will not be applied if an exclude

exclude property expression matches a property first.

更多参数详情查看

https://https://www.sodocs.net/doc/2810636796.html,/confluence/display/W W/JSON+Plugin

查看源码JSONResult.execute():

查看源码 JSONResult.execute():

所以result中的result就是现在valuestack中找,找不到则用action

从上图可以看出,我们可以利用JSONUtil来把一个JAVA对象序列化为JSON串

七、struts2 tag和ognl

用标签属性设置值要理解两件事,属性是否需要字符串文本或者OGNL表达式。

首先,我们需要考虑标签上的属性最终要被java代码处理。但在JSP页面中,都是字符串。使用其他技术,你可能很熟悉使用转移序列来强制属性被转换成表达式。伴随着使用${表达式}符号的增加,常常导致标记的标签可读性差。为了使OGNL表达式使用起来更直观和可读性,Struts2做出了针对每个属性他期望何种数据的假设。哪些属性是字符串哪些是非字如果属性是字符串类型,则值写到属性上,在实际的jsp与Velocity页面中被解释成字符

串文本符串。如果属性是非字符串类型,则被解释成OGNL表达式的值写到属性上。

value属性是Object类型,一个非字符串属性。该用法会携带一个java属性,典型的是来自于ValueStack中,并作为字符串写到渲染的页面中。栈中属性可以是任何java类型。转换成串的工作会自动被OGNL类型转换器处理。value属性告诉渲染页面的属性名。

由于没有用#指定ActionContext中的对象,因此使用ValueStack对象若nonExistingProperty不存在,会怎样?一个null值会被转换成空字符串。第一个标签没有任何东西会被渲染。

Default属性用于提供没有找到对象时的默认值,既然default属性是提供默认串,那么他就是字符串类型。

但可以使用%{表达式}语法强制字符串属性解释为OGNL表达式。

我们可能对多种标记很熟,比如${表达式},这表明哪个文本被视为表达式哪个是真正的串。

注意,强制字符串类型的值用作OGNL表达式取值与JSTL语言的想似之处。

OGNL使用%而不是$。这可能和jsp中的语法相混淆,实际上,你很少使用这一方式。这要归于标签智能的默认行为,大都时候你会让标签决定何时解析成ONGL表达式何时解析成串。这也是框架减少常见任务的方式。

Struts2hibernate实现用户登录和增删改查案例(精)

Struts2+hibernate实现用户登录和增删改查案例 Struts2+hibernate实现用户登录和增删改查案例 开发工具MyEclipse 10.7.1 创建一个项目 web项目project。 部署好Struts2的开发环境: 1、引入需要的类库文件jar 2、添加struts2的配置文件struts.xml //src路径:classespath: 3、在web.xml添加启动struts2 MVC框架的过滤器 4、添加Hibernate所依赖的jar文件 (注意:如果Hibernate添加的jar文件与struts2添加jar文件名称完全一致(只需其中之一(版本不一致保留高本版 5、同样添加hibernate的配置文件 Classespath: src路径下面 6、需要添加对应数据库操作的驱动文件jar 在此基础上对 admin这个类完成增删改查的操作。 在src下搭建开发框架,如图所示: struts.xml文件: xml version="1.0" encoding="UTF-8"?> DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "https://www.sodocs.net/doc/2810636796.html,/dtds/struts-2.3.dtd"> struts> struts-admin.xml文件: xml version="1.0" encoding="UTF-8"?> DOCTYPE struts PUBLIC

SSH2_增删查改实例

SSH2 增删查改实例 (0)软件和框架版本: MyEclipse 6.0.1 Tomcat 6.0.14 Sturts2 1.8 Hibernate 3 Spring 2.0 Mysql 5.1 (一)引入包(共73个,不一定都需要,但是我的项目是这么多,经过调试,有没包冲突)

(二)创建数据库表 建立数据库octtest,并创建user表,表里面一共4个字段:id,姓,名,年龄。 语句如下: create database octtest; user octtest; DROP TABLE IF EXISTS `users`; CREATE TABLE `users` ( `id` int(10) unsigned NOT NULL, `firstname` varchar(50) NOT NULL, `lastname` varchar(50) NOT NULL, `age` int(10) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; (三)用myeclipse 中自带的hibernate reverse engineering 工具,根据刚才创建的user表,自动生成实体User 和相应的User.hbm.xml配置文件。 1)在myeclipse中的视图中创建连接数据库连接,如下图:

填入mysql数据库相应的路径,用户名,密码等信息。注意:这里要引入mysql-connector-java的jar包,需要从外部导入。 2)连接数据库正常后,选择octtest数据库中的user表,右键-》hibernate reverse engineering。自动生成实体User 和相应的User.hbm.xml配置文件。(正常情况下可以生成,但是笔者生成engineer有问题,所以只能够手动创建User类和相应的User.hbm.xml,,所以如果读者顺利创建,可跳过2a,2b两部) 2a)创建User实体类 User.java package com.bean; public class User { public Integer id; public String firstname; public String lastname; public int age;

Struts注解

struts2-convention 既然说了是全注解开发,而且我们已经实现了Hibernate与Spring的注解。同样的,Struts2也能够做到用注解来代替配置文件,struts2-convention插件可以帮助我们完成这一功能。它是struts2提供的一个插件,目前网上相关的中文文档主要是一个叫石太洋的人根据官方文档翻译的,很多网站与博客都有转载。我看了原文与译文,感觉讲的不够清楚,例子也很简单。大象根据自己在项目中的实际使用情况,现将个人对这个插件的经验总结写出来与各位分享,希望与大家多交流,共同提高。 官方文档 请不要把地址中的两个大写W换成小写,否则是打不开页面滴!这个插件的使用其实非常简单,如果光看文档可能会觉得好像很麻烦。那么大象来告诉你怎样快速学习这个插件。 首先你要搞清楚,这个插件它会默认扫描所有包名为struts、struts2、action、actions下面的类。然后它会对实现了Action接口以及类名以Action 结尾的这些类,作为Action来进行处理。 你可以重新定义按哪种包名进行扫描。比如本例设定,只扫描web包下面的所有类,因为我们将Action类都放在这个包下面。 那这个插件是怎么实现原来的配置信息的呢?它的映射规则是这样的,对于以Action结尾的的类,去掉Action,取剩下的部分,将所有的字母转换为小写,如果有驼峰式的写法,则用"-"连接符来连接不同的单词,这是此插件的默认方式。最终转换之后的就是请求地址,还是用例子说明。 https://www.sodocs.net/doc/2810636796.html,erAction 按照上面的规则,请求地址就应该是UserAction去掉Action后缀,将其余部分转换为小写,所以user就是我们的请求地址。不过,这还没有完,因为这里面还有一个命名空间的路径,在通常的配置文件中,一般会将不同的功能进行划分,在package标签里加上namespace属性。使用这个插件,它会为你自动配上命名空间,默认的就是前面说到的以那四种名称为根目录的命名空间,它们之后的都将成为命名空间的名称。 https://www.sodocs.net/doc/2810636796.html,erAction 映射为 /user.action https://www.sodocs.net/doc/2810636796.html,erAction 映射为 /base/user.action 要是我们不以struts或其它几种默认值为包名,又该怎么办呢?没关系,插件为我们提供了一种自定义根包的配置方式 上面这段配置是写在struts.xml里面的,它指定web为根,作用就相当于那四种默认值。 https://www.sodocs.net/doc/2810636796.html,erAction映射为 /base/user.action com.bolo.examples.web.HelloAction 映射为 /hello.action com.bolo.examples.web.HelloWorldAction 映射为 /hello-world.action

增删改查代码

增: 调用的是hibernate的save方法。 Action中传值方式有两种,一种是以对象传值,一种是以属性传值,所以在Action中有两种方式来接收。 private HibernateTemplate hibernateTemplate; 一:以属性传值: jsp页面: 用户名: 密码: 年龄: function addData() { var name= $("#name").val(); var psw = $("#psw").val(); var age= $("#age").val(); var param={"name":name,"psw":psw,"age":age}; $.post("adddata.action",param,function(data){ if(data="success") { alert("添加数据成功"); window.close(); window.opener.location.reload(); } else { alert("添加数据失败"); } }); } 需要注意的是:以属性传值的话Struts不会自动生成对象,需要自己手动来完成。如果是以对象来传值的话,会自动生成对象。 Framework frame = new Framework(); frame.setAge(age); frame.setName(name); frame.setPsw(psw); frame.setCreatetime(new Date()); frameworkService.saveData(frame); response.setCharacterEncoding("UTF-8"); response.getWriter().write("success");

增删改查流程

1)拷贝下面所说的.java文件,9个java文件和相应的包名,这些都是大果任封装好的文件,可以直接用。 dao包里面有:Dao.java 还有一个impl包:IDao.java manager包里面有:IBaseManager.java IManager.java IUserLoginManager.java 还有一个impl包:BaseManager.java struts包里面有: ApplicationResources.properties 还有一个action包:BaseAction.java IAction.java utils包里面有:MyActionProxy.java ObjectUtils.java 再把 log4j.properties 贴到src包下面。 2)把 applicationContext.xml spring-form.tld spring.tld struts-bean.tld struts-config.xml struts-html.tld struts-logic.tld struts-nested.tld struts-tiles.tld validator-rules.xml web.xml 这些以前写过的都可以贴过来,你可以直接把这个项目里的都贴过去,以后就直

接在这里该代码就行了。 以上两个步骤样就是为了完成手写SSH代码 3)新建一个pojo包: 创建一个实体: 先让这个类实现序列接口如: 然后写相应的字段: 利用get和set方法生成每个字段的get()和set()。例如: 4)为了更够生成所以为每一个字段写出相应的元数据:1.生成相应的表: 说明:利用hibernate生成UserLogin表。 2.字段id的映射,元数据要写在get()方法前面: 3. 字段username的映射,元数据要写在get()方法前面: 4. 字段password的映射,元数据要写在get()方法前面: 这样这个UserLogin.java就完成了。 5)右键项目名称找到“属性”选项: 找到:XDoclet 点击这个出来相应的界面: 单击按钮,

使用struts2、数据库、JSP实现增、删、改、查源码

Action 包下面的class文件: package action; import https://www.sodocs.net/doc/2810636796.html,erDao; import https://www.sodocs.net/doc/2810636796.html,erDaoImp; import https://www.sodocs.net/doc/2810636796.html,er; public class UserAction { private User user; public String add(){ UserDao userDao = new UserDaoImp(); try { userDao.save(user); return"success"; } catch (Exception e) { e.printStackTrace(); return"error"; } } public String update(){ UserDao userDao = new UserDaoImp(); try { userDao.updata(user); System.out.print("----"); return"success"; } catch (Exception e) { e.printStackTrace(); return"error"; } } public String delete(){ UserDao userDao = new UserDaoImp(); try { userDao.deleteById(user.getId()); return"success"; } catch (Exception e) { e.printStackTrace(); return"error";

} } public String show(){ UserDao userDao = new UserDaoImp(); try { user = userDao.findById(user.getId()); return"success"; } catch (Exception e) { e.printStackTrace(); return"error"; } } public User getUser() { return user; } public void setUser(User user) { https://www.sodocs.net/doc/2810636796.html,er = user; } } package action; import java.util.List; import https://www.sodocs.net/doc/2810636796.html,erDao; import https://www.sodocs.net/doc/2810636796.html,erDaoImp; import https://www.sodocs.net/doc/2810636796.html,er; public class UserListAction { private List users;

Struts2简单示例

Struts2增删改查例子 UserBean //要添加set,get public class UserBean{ private Long id; private String name; private String password; private int age; private Date birthday; private Long sex; private Set likes; private String des;//描述 } public class LikeBean{ private Long id; private String name; } FormAction public class FormAction{ //属性要生成get,set //标记(添加,修改) private String tip; private UserBean userBean; private List likeList; private List userList; //到列表页面 public String list(){ userList =new ArrayList(); userList.add(new UserBean("abc",19,new Date())); userList.add(new UserBean("def",70,new Date())); userList.add(new UserBean("ghi",40,new Date())); return"list"; } //到添加页面 public String toAdd(){ likeList =new ArrayList(); likeList.add(new LikeBean(new Long(1),"上网")); likeList.add(new LikeBean(new Long(2),"读书")); likeList.add(new LikeBean(new Long(3),"游戏")); tip ="add"; return"info";

数据库语句增删改查

mysql语句用法,添加、修改、删除字段一,连接MySQL 二,MySQL管理与授权 三,数据库简单操作 四, 数据库备份 五,后记 一,连接MySQL 格式:mysql -h 远程主机地址 -u 用户名 -p 回车 输入密码进入: mysql -u root -p 回车 Enter password: ,输入密码就可以进入 mysql> 进入了 退出命令:>exit 或者ctrl+D 二,MySQL管理与授权 1.修改密码:

格式:mysqladmin -u 用户名 -p 旧密码 password 新密码 2.增加新用户: >grant create,select,update....(授予相关的操作权限) ->on 数据库.* -> to 用户名@登录主机 identified by '密码' 操作实例: 给root用户添加密码: # mysqladmin -u root password 52netseek 因为开始root没有密码,所以-p旧密码一项可以省略. 登陆测试: # mysql -u root -p 回车 输入密码,成功登陆. 将原有的mysql管理登陆密码52netseek改为52china. # mysqladmin -u root -p 52netseek password '52china' 创建数据库添加用户并授予相应的权限: mysql> create database phpbb; Query OK, 1 row affected (0.02 sec)

mysql> use phpbb; Database changed mysql> grant create,select,update,insert,delete,alter -> on phpbb.* -> to phpbbroot@localhost identified by '52netseek'; Query OK, 0 rows affected (0.00 sec) 授予所有的权限: >grant all privileges >on bbs.* >to bbsroot@localhost identified by '52netseek' 回收权限: revoke create,select,update,insert,delete,alter on phpbb.* from phpbbroot@localhost identified by '52netseek'; 完全将phpbbroot这个用户删除: >use mysql >delete from user where user='phpbbroot' and host='localhost'; >flush privileges; 刷新数据库 三,数据库简单操作

Struts框架和Hibernate框架的整合完整版介绍

Struts框架和Hibernate框架的整合 1、首先写一个student的实体类,命名为:StudentEntity.java package com.liu.student.entity; /** * 数据库表的映射实体类文件 * @author Calasin */ public class StudentEntity { private String s_id;// 学号 private String s_name;// 姓名

private int s_age;// 年龄 public String getS_id() { return s_id; } public void setS_id(String s_id) { this.s_id = s_id; } public String getS_name() { return s_name; } public void setS_name(String s_name) { this.s_name = s_name; } public int getS_age() { return s_age; } public void setS_age(int s_age) { this.s_age = s_age; } public String toString() { return"StudentEntity [s_id="+ s_id+ ", s_name="+ s_name + ", s_age=" + s_age + "]"; } } 2、接着写student实体类StudentEntity的配置文件:StudentEntity.hbm.xml

JDBC操作Oracle数据库(增删改查详细实例教程)

private final String = "oracle.jdbc.driver.OracleDriver"及登录;功能实现。E clipse + struts2+oracle+jdbc eb开发技术框架入门小项目,一般都是从增删改功能实现开始入手,就像学编程语言几乎从“HelloWorld final”一样的经典,本人初入 String = "jdbc:oracle:thin:@192.168.0.99:1521:denver"; private final String DBUSER = "zzw"; private final一、环境搭建 "zzw"; private Connection conn = null; 导入必要的包,我所建工程引入如下包: public DataBaseConnection( { C lasses12.jar commons-fileupload-1.2.2.jar commons-io-2.0.1.jar commons-lang-2.5.jar freemarker- 2.3.16.jar javassist-3.11.0.GA.jar ognl-3.0.1.jar ojdbc14.jar struts-core-2.2.3.jar xwork-core-2.2.3.jar try { 引入的包具体的版本同struts 的版本有关系,我的是sturts2.2.6.(DBDRIVER; this.conn = DriverManager.getConnection 二、DBURL, web.xml, DBPASSWORD; } 我的web.xml内容如下: } xml } ?> // 取得数据库连接web-app public Connection getConnection( { "xmlns=" return xmlns:web="https://www.sodocs.net/doc/2810636796.html,/xml/ns/javaee/web- app_2_5.xsd" }="https://www.sodocs.net/doc/2810636796.html,/xml/ns/javaee https://www.sodocs.net/doc/2810636796.html,/xml/ns/javaee/web-app_2_5.xsd " id="WebApp_ID"version=" close( {"> try{// 我的工程名为webDemo } catch (Exception e { }

ofbiz配置加增删改查

一、安装OFBIZ 1.配置数据库 比如我的ofbiz的根目录为H:\workspace\csofbizworkspace\weidaPlatform设置为OFBIZHOME 则打开OFBIZHOME/framework\entity\config\entityengine.XML文件 修改数据源名称: 然后往下查找,你定义的datasource-name的数据库,比如我这里是localmssql 修改jdbc-uri 和账号和密码 2.创建数据库 在数据库中手动创建你指定的数据库,我这里是weidaTest 3.打开命令提示符窗口 使用cd命令进入到ofbiz根目录 比如我的ofbiz根目录为H:\workspace\csofbizworkspace\weidaPlatform 然后输入ant load-demo执行 4.执行完毕后,进入创建的数据库看下,是不是增加了表,然后再打开user_login表看了,里面是否有数据,如果有,则表示安装完成 二、新建应用 修改配置文件 1.把ofbiz导入到eclipse中 2.在OFBIZHOME/hot-deploy文件夹下,重新复制一份weidaTest并重命名为weidaTest2 3.打开weidaTest2根目录下的build.xml文件,把weidaTest全部替换为weidaTest2 4.打开weidaTest2根目录下的ofbiz-component.xml文件,把weidaTest全部替换为weidaTest2,并清掉所有的服务和实体和初始数据的配置 5.把weidaTest2/webapp下的weidaTest更改为weidaTest2 6.打开文件wedaTest2/wepapp/weidaTest2/WEB-INF/web.xml 把weidaTest替换为weidaTest2 7.打开weidaTest2/widget/CommonScreens.xml把所有的weidaTest替换为weidaTest2 8.打开weidaTest2/widget/ProductMenus.xml把所有的weidaTest替换为weidaTest2 9.把entitydef和servicedef,data,src清空 10.在src右键build path->use assource folder 到目前为止基本配置文件已经修改完毕

JAVA开发个人简历

个人简历个人信息 姓名:xxxxxxx性别:x 电话:187-xxx7-xxxx 年龄:22 邮箱:lxxxxxxx@https://www.sodocs.net/doc/2810636796.html,专业:软件技术 应聘职位 Java软件开发工程师 专业技能 熟练掌握CoreJava编程,具有扎实的编程功底和良好的编码习惯 熟练掌握ssh(Struts2+hibernate+Spring)等轻量级框架 熟悉MVC开发模式 熟练使用Eclipse/MyEclipse工具进行Java软件开发 熟练Unix/Linux环境下Java的应用软件开发 熟练掌握MySQL、Oracle等数据库操作,能编写常用SQL语句 熟悉软件开发的主要流程,可以根据指定要求快速完成设计、编码等工作

了解xml、HTML、JavaScript、Ajax技术 项目经验 一、通用电子商务平台(当当网购物系统) 开发环境:Linux 开发工具:MyEclipse8.6,Tomcat,MySQL 技术实现:Struts2+Hibernate+Spring+JavaScript+JSP+AJAX 项目描述:此系统为网上购物系统,用户可以用过该系统实现网上购物、注册、登录、浏览商品、订货、生成订单功能。也包括对普通商品增删改查功能和购物车内 书的数量的增删改功能。 责任描述:独自完成项目的整个开发过程 用户模块包括登录与注册,主要使用了AJAX对其输入的信息进行验证,结合 Hibernate存储和验证用户登录等。 商品列表模块主要是用List集合来展示商品。 购物车模块则是使用Session技术来保存购物车,通过Struts2调用不通方法来 操作购物车中的商品集合,实现对购物车的增删改查。 订单模块主要是用Hibernate对用户所买商品的记录进行存储。 经验总结:这个项目让我们把我们所学习的三大框架以及JS,Ajax等都联系起来。尤其是使用Hibernate经常出现异常,在和组内成员讨论中逐步解决问题,并且更加 完善代码。通过这个项目不仅提高我个人能力,而且还促进了与他人合作的能力。 二、教学管理系统

基于Struts2简单的学生成绩管理系统

基于Struts2简单的***管理系统 (登录注册增删改查)系统平台要求: 开发环境: Windows操作系统 开发工具:Myeclipse+Jdk+Tomcat+MySQL数据库 要求:标题之间必须有过渡段;正文用小四号字体,段落格式首行缩进2个字符,1.5倍行距;论文中的表必须是三线表,图必须用vs画,图和表中的文本是五号字体;图必须有图序和图题,表必须有表序和表题。 论文文档命名:专业班级姓名--基于Struts2简单的***管理系统.docx 1.系统简介 系统的主要功能模块 (1)学生信息注册: 通过这个功能,可以注册学生的学号,年龄,email等。 (2)学生信息删除: 通过这个功能,可以根据学生的账号,删除学生的信息。 (3)学生信息修改: 通过这个功能,可以修改学生信息,比如密码。 (4)学生成绩查询: 通过这个功能,学生可以对自己本期的成绩进行查询 (5)学生成绩录入: 通过这个功能,可以根据学号来录入学生的成绩。

2.需求分析 随着计算机的崛起,现实生活中计算机可以做很多人不能做的事情,在管理方面,它也很在行,所以我们要学会运用计算机去更好服务生活。 2.1系统的现实意义和可行性分析 本系统的最终用户为在校的教师和学生,根据从学校方面取得的图表资料,文字资料以及其他细节方面的信息,根据日常生活中的经验,根据所做的其他询问和调查,得出用户的下列实际要求: (1)本系统的组成 老师、学生和成绩信息。 一个老师管理一批学生。 每个学生有自己的学号,出生日期等信息。 每个学生的成绩有语文,数学等。 (2)学校的调查情况 在学校,学生考试,学生对自己的成绩查询,教师对自己学生成绩的查询都要依靠一个简单。方便的系统。因此,学生成绩管理系统的设计十分必要。 2.2模块设计功能结构图 根据用户的需求,把学生成绩管理系统分为以下几个子系统: (1)查询子系统:学生通过学号来查询自己的成绩。 (2)修改子系统:学生通过学号和密码修改自己的密码。 (3)删除子系统:通过学生的学号来删除已经录入的信息。 图1-1:学生成绩管理功能结构图

SCME G2 结业考试3

1.下面关于AOP的说法错误的是( C )。 A.AOP将散落在系统中的“方面”代码集中实现 B.AOP有助于提高系统的可维护性 C.AOP已经表现出了将要替代面向对象的趋势 D.AOP是一种设计模式,Spring提供了一种实现 2.关于XmlHttpRequest对象的readyState属性,下列说法中正确的有( AC )。【选两项】 A. 当open()方法调用后,readyState属性值为2 B. 当readyState的值为3时,send()方法已经被调用 C. 当readyState的值为3时,服务器已经响应,但响应未完全结束 D. 当readyState的值为4时,HTTP响应码一定是200 3.在web.xml文件中配置Spring框架,以下选项中配置正确的是( C )。 A. config /WEB-INF/classes/applicationContext.xml B. servletConfig /WEB-INF/classes/applicationContext.xml C. contextconfig /WEB-INF/classes/applicationContext.xml D. contextConfigLocation /WEB-INF/classes/applicationContext.xml 4.在SSH整合过程中,下列说法正确的是( B )。 A. Spring DAO需要注入DataSource B. Spring DAO需要注入SessionFactory C. DataSource需要注入SessionFactory D. Spring DAO无须注入SessionFactory 5.有关联合(Union)、子查询与联接,下列说法中错误的是( AC )。【选两项】 A. 联合主要用于合并多个数据表中的行,合并过程中的每个select语句不一定有相同的结构 B. 子查询是一个嵌套在 SELECT、INSERT、UPDATE 或 DELETE 语句或其他子查询中的查询。任 何允许使用表达式的地方都可以使用子查询 C. 联接主要用于合并多个表中的列 D. 通常情况下,若查询数据来源于多张表,可以采取上述3种方式查询 6.关于Hibernate,下列说法中错误的是( C )。 A. Hibernate是一个“对象-关系映射”的实现 B. Hibernate是一种数据持久化技术

java项目经验

27.项目平台管理系统: 该项目主要用于项目的目标控制,其目的为项目建设的增值服务。项目包含项目管理,任务管理,信息箱,客户信息管理,权限管理,我的信息六大功能模块。系统基于B/S三层架构,采用struts2+Spring?+?Hibernate?框架.使用Oracle?数据库。本项目只投入7个人,开发周期为2个月。本人主要负责项目管理模块,根据模块需求利用ssh和Javascript、easyUI、ajax等技术完成——基本信息管理,需求分析管理,模块管理,功能管理,附件管理五个子模块。 功能描述: 1.页面展示五个模块的一些基本信息。 2.后台系统管理页面:项目开发ERP管理细化模块的增删改查+分页。 3.后台数据库管理:项目开发信息的增删改查+分页 4.添加数据页面验证; 应用技术: 采用Ajax实现页面的无刷新异步通信。 应用SSH实现文件上传与下载功能。 应用SSH+easyUi对数据库数据进行增删改查+分页+模糊查询。 应用easyUi对表单进行验证并阻止表单重复提交。 网络版办公自动化管理系统(Web OA): 本系统是一个实现企业内各种信息资源共享、加强员工间的交流、提高整体工作效率、为领导各种有用数据、方便领导对公司情况的及时了解、提供决策支持和提供各种工作记录以备事后查询的信息系统。采用Struts2、Spring、Hibernate 、HTML、JavaScript、DWR 等相关技术。本人在项目中进行了前期的需求分析,系统架构实现,数据库建模,及部分编码工作。?? 网上购物系统: 本系统是一个在线商品交易平台, 开发环境与技术:MyEclipse6.0,Tomcat6.0,Oracle9i,JSP,Servlet,Spring,Hibernate,Struts2 项目简述:该系统成功运行于Linux环境下,使用B/S模式开发。采用基于MVC设计模式的框架Struts,使用JavaBean实现了Module层的业务逻辑和数据的读取,在View层采用JSP与JSTL及EL相结合,增强了系统的强壮性。 本人职责:参与该系统用户注册、登陆模块实现,购物模块设计。独立开发了购物车模块。完成对该系统部分的测试工作,并完善了该项目的相关文档资料。 项目名称/客户名称: 盛宇家纺电子商务: 开发环境与技术:Jbuilder,Oracle,Struts2,Tomcat5,Jsp,Ajax,Jquery 项目简述:本系统和我公司为客户开发的盛宇家纺的ERP 无缝绑定,实现工厂的产销

Struts2_spring整合

Struts_spring整合 第一步:建立WEB工程Spring_Struts2 第二步: ①导入struts2支持的JAR包:将 struts-2.1.8.1-all\struts-2.1.8.1\apps\struts2-blank-2.1.8.1\WEB-INF\lib下的所有JAR包(6个jar 包,是struts必要的包)拷入到工程目录下的WEB-INF/lib目录下,如果没有看到你拷入的JAR包需要强制加载(这一步指的是如果包导入到lib下后仍然存在WEB-INF/lib下而没有 在工程下出现Referenced Liberaries这一项则需要选中lib文件夹,单击右键,Build Path,Configure Build Path,在弹出的对话框中选择Order and Export,Select All,确定)。

②此外还需要struts2-spring-plugin-2.1.8.1.jar支持包,整合spring与struts2所必需的JAR 包,它位于struts-2.1.8.1-all\struts-2.1.8.1\lib目录下 第三步:拷贝配置文件web.xml,struts.xml,它们分别位于路径: ①struts-2.1.8.1-all\struts-2.1.8.1\apps\struts2-blank-2.1.8.1\WEB-INF(web.xml所在位置)拷贝Web.xml文件到工程的Web-INF路径下。Web-INF路径下是受保护的,不会被访问到,保证数据的安全。 ②struts-2.1.8.1-all\struts-2.1.8.1\apps\struts2-blank-2.1.8.1\WEB-INF\classes(struts.xml所在位置)拷贝struts.xml文件到工程的src文件下并删除标签内的内容,它用于配置action。内部有一个包含文件,这段代码表示,struts.xml中的包含文件是com/ibm/struts/conf包下的struts_user.xml。 第四步:配置struts.xml文件 解决乱码问题:

struts2增删改查功能

struts2 增删改查功能实现先看下总体项目 这是用户登陆表 这是用户信息表

1.在用户输入用户名和密码登陆之后,我们可以直接调用一个查询所有用户信息的方法,这样就可以查看到所有用户信息了,所要做的就是要写多个方法来执行,然后返回给页面显示(在这里我没有做分页演示),大家要有耐心的看哦,代码有点多。。。 ------------------------------action类代码-------------------------- package laogen.action; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import https://www.sodocs.net/doc/2810636796.html,mon.DBcon; import laogen.dto.depDto; import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings("serial") public class action extends ActionSupport { private String username;//注意这里跟index.jsp form里面的name属性要对应private String password; private String msg; public String getMsg() { return msg; }

J2EE考试复习试题2

一、填空: 1.Struts 2框架由__WebWork_________和____XWork_______框架发展而来。 2.Struts 2以__过滤器_________为核心,采用____拦截器_______的机制来处理用户的请求。3.构建Struts 2应用的最基础的几个类库是_____struts2-core______、____xwork_______、____freemaker_______、__ognl_________以及____commons-logging_______。 4.Struts 2中的控制器类是一个普通的____POJO_______。 5.如果要在JSP页面中使用Struts 2提供的标签库,首先必须在页面中使用taglib编译指令导入标签库,其中taglib编译指令为____<%@ uri=”/struts-tags” prefix=”s”%>_______。6.在Struts 2表单标签库中,表单标签为___________。7.ActionSupport类实现了__Action_________接口和_____ValidationAware______等接口。8.通过控制器类中的___validate________方法来输出校验错误信息。 9. Struts 2以___FilterDispatcher_______为核心控制器,它的初始化方法为__init(FilterCongif filterConfig)________。 10.Hibernate配置数据库连接的四种属性名是connection.driver_class 、https://www.sodocs.net/doc/2810636796.html,ername 、connection.password 、connection.url 。11. 在Hibernate XML影射文件中描述主键生成机制,其属性描述了主键的生成策略,至少写出三种策略名identity 、native 、increment 。 12.基于Hibernate用标注(annotations)描述映射关系,映射实体类中表示主键的属性的标注是___@Id________ ;映射实体类中普通属性的标注是___@Column________;实体属性对应的列用标注____@Entity_______。 13.Hibernate的会话接口中声明了持久化的操作,删除一个实体的方法是__delete(obj)_________,合并一个实体的方法是____merge_______,获得事务处理接口的方法是_getTransaction()__________。 14. Hibernate的会话接口同时又是一个工厂类型:创建一个HQL查询接口的方法是____createQuery_______,创建基于公式(标准)接口的方法是__createCriteria_________。 15. 对象关系映射(ORM)的基本原则是:类型(class)映射___表________,属性(property)映射____列_______,类型的实例或对象(instance | object)映射___一条记录________。 16. Hibernate应用缺省的XML格式的配置文件名是___hibernate.cfg.xml________, 放置在__classpath_________下;配置数据库方言的属性名是____dialect_______。 17. 在Hibernate中级联操作的属性值至少写出三个_______save-update____ 、_____none______、_____delete______。All ,delete-orphan 18 基于Hibernate用标注(annotations)描述映射关系,实体类型用标注__@Entity_________ ;实体对应的表用标注___@Table________。 19 Hibernate的会话接口是__Session_________,它由接口___SessionFactory________创建;Hibernate处理事务的接口是___Transaction________;封装HQL的接口是___Query________ 。 二、选择: 1) 在三层结构中,数据访问层承担的责任是(B)〔选一项〕 a) 定义实体类 b) 数据的增删改查操作 c) 业务逻辑的描述

相关主题