【j2ee spring】9、整合SSH框架(2)

整合SSH框架(2)

Spring4+hibernate4+Struts2的整合,整合完成后我会把这个项目上传上去,但是我的建议是最好还是自己在自己的电脑上自己整合一下,我不保证一定没问题

1、整合Struts2之前

前面我们已经整合了spring4和hibernate4,接下来我们继续整合Struts2

引入一些Struts2的包

其中有部分是重复的,比如commons-logging这个包,这个大家自己看着删

2、开始整合,我们先配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
							http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">

	<!-- 在web容器中实例化spring容器 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value><!-- 这个指定spring的配置文件,默认从web根目录寻找配置文件,我们可以通过spring提供的classpath:前缀指定从类路径下 寻找 -->
	</context-param>
	<!-- 实例化spring容器 -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<!--         <init-param>
            <param-name>config</param-name>
            <param-value>struts.xml</param-value>
        </init-param> -->
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>

</web-app>

这个Struts2的部分和单个的Struts2的配置一样,不一样的地方就是加入了用web.xml管理spring的实例化

这里我们先看看用这个org.springframework.web.context.ContextLoaderListener监控spring实例化的文件吧实例化文件放到那里去了???

我们打开这个类的源码,找到这个方法,进入到initWebApplicationContext里面去看看,

在源代码里面我们可以找到

servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);

这下我们知道了,他是放到了servletContext里面去了,后面我们就在这个里面取出来

3、接下来我们继续配置Struts2.xml文件

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

<struts>
	<package name="person" extends="struts-default">
		<action name="PersonAction" class="cn.cutter_point.web.action.PersonAction" method="execute">
			<result name="list">page/personlist.jsp</result>
		</action>
	</package>
</struts>

我们就以前面建立的person类为代表,取得所有的persons对象

我们写一下我们的action类,来处理跳转,以及调用业务

PersonAction.java

/**
 * 功能:集成ssh框架
 * author:cutter_point
 * 时间:2015年3月29日17:30:07
 */
package cn.cutter_point.web.action;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import cn.cutter_point.service.PersonService;

import com.opensymphony.xwork2.ActionSupport;

public class PersonAction extends ActionSupport
{

	@Override
	public String execute() throws Exception
	{
		//获取实例,方法1
		ServletContext sc = ServletActionContext.getRequest().getSession().getServletContext();
		WebApplicationContext wac = (WebApplicationContext) sc.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
		//方法2
		WebApplicationContext webApplicationContext = WebApplicationContextUtils.
													getRequiredWebApplicationContext(ServletActionContext.getServletContext());

		if(wac == webApplicationContext)
		{
			System.out.println("ok!!!");
		}

		PersonService personService = (PersonService) wac.getBean("personServiceBean");

		HttpServletRequest  request = ServletActionContext.getRequest();

		request.setAttribute("persons", personService.getPersons());

		return "list";
	}

}

好的,如果你认真看了上面的代码的话,你会发现实例化spring的方法有两个,但是到底哪个好,我也不知道,反正两个取出来的东西是一模一样的,没有什么区别

Struts2获取request三种方法

struts2里面有三种方法可以获取request,最好使用ServletRequestAware接口通过IOC机制注入Request对象。

在Action中获取request方法一:

在Action中的代码:

Map request =(Map)ActionContext.getContext().get("request");

List<Task> tasks = taskManager.findAll();

request.put("tasks", tasks);

在JSP页面中获取其中的值:

<s:iterator id="task"value="#request.tasks">

<trclass="table_header">

<td><s:propertyvalue="#task.tname"/></td>

<td><s:propertyvalue="#task.tuid"/></td>

<td><s:propertyvalue="#task.tstartTime"/></td>

<td><s:propertyvalue="#task.tendTime"/></td>

<td><s:propertyvalue="#task.tstate"/></td>

<td><inputtype="radio" id="choose" name="choose"onclick="getId(this.value)" value="<s:propertyvalue=‘#task.tid‘/>"/></td>

</tr>

</s:iterator>

--------------------------------------------------------------------------------------------

方法二:通过ServletActionContext类来获取,使用struts2经验如果处理get传参是中文,只能使用该方法进行处理乱码问题

Action中代码:

HttpServletRequest request =ServletActionContext.getRequest();

request.setAttribute("username","zhangsan");

在jsp中获取其中的值

<s:propertyvalue="#request.username">或者${requestScope.req}

--------------------------------------------------------------------------------------------

方法三:通过ServletRequestAware接口通过IOC机制注入Request对象

Action中的代码:

Action实现ServletRequestAware接口,实现接口中的方法

private HttpServletRequest request;

//实现接口中的方法

public void setServletRequest(HttpServletRequestrequest){

this.request = request;

}

//然后在execute()方法中就可以使用了

public String execute(){

request.setAttribute("username", "zhangsan");

request.getSession().getServletContext().getApplication(); //得到Application

}

该方法必须要实现,而且该方法是自动被调用

这个方法在被调用的过程中,会将创建好的request对象通过参数的方式传递给你,你可以用来赋给你本类中的变量,然后request就可以使用了

注意:setServletRequest()方法一定会再execute()方法被调用前执行

4、我们接下来写一下我们的jsp文件

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <title>SSH之人物列表</title>

	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>

  <body>
    <s:iterator var="persons" value="#request.persons">
    	id号是:<s:property value="id"/>	名字是:<s:property value="name"/><br>
    </s:iterator>
  </body>
</html>

这里我们来扩充一下Struts2的标签的知识

struts2标签使用中,什么时候用#,什么时候可以不用#

比如我看有些是这样写的:
<s:iterator id="page" value="List"></s:iterator>
<s:iterator id="page" value="#List"></s:iterator>
哪位能说的详细点,不要说在什么根不根中的,这个纠结了我好久。
值栈中的对象的不使用#,非值栈中的对象使用#
如果你不理解值栈的作用,简单点理解:当前action,或者处于action链中的action所拥有的属性,并且为该属性提供了getter和setter方法,那么在jsp中就不需要使用#,除此之外需要使用#,那么从这里你就可以知道action的属性如果提供了getter和setter方法,那么这些属性值就会放置到值栈中

struts标签<s:iterator>怎么用

把action中的List对象,在页面用<s:iterator>把List的内容循环显示出来

首先有一个User对象
public class User {
      private Integer userId;
      private String userName;
      private String userPwd;

      //get和set方法
      ...........
}

action中的代码
List list = new ArrayList();

User user1 = new User();
user1.setUserId(1);
user1.setUserName("zhangsan");
user1.setUserPwd("123456");

list.add(user1);

User user2 = new User();
user2.setUserId(2);
user2.setUserName("lisi");
user2.setUserPwd("1234");

list.add(user2);
在把list放在request中,好在jsp页面中能拿到

jsp页面中的代码

<table>
<s:iterator value="list" id="别名">//这个id加不加都没事
   <tr>
        <td><s:property value="user.userId"/></td>//这也可以写成<s:property value="别名.user.userId"/>

        <td><s:property value="user.userName"/></td>
        <td><s:property value="user.userPwd"/></td>
   </tr>
</s:iterator>
</table>

这样就可以了!

参考:

http://zhidao.baidu.com/question/172130287

5、启动tomcat

打开http://localhost:8080/ssh/PersonAction(我使用的是tomcat,具体tomcat怎么搞,就不在这里啰嗦了)

控制台运行结果:

项目下载地址:http://download.csdn.net/detail/cutter_point/8544889

时间: 2024-10-08 15:13:55

【j2ee spring】9、整合SSH框架(2)的相关文章

【j2ee spring】12、整合SSH框架(终结版)

[j2ee spring]12.整合SSH框架(终结版) 最后,我们把整个项目的截图,代码发一下,大家不想下载那个项目的话,可以在这里看到所有的代码(因为那个项目需要一个下载积分,真不多= =,我觉得我搞了那么久,收点积分应该不过分吧...嘿嘿) 这里,我尽量用截图来搞,免得复制粘贴,怪烦的 一.项目整体截图 二.开始全部代码 Person.java Person.hbm.xml PersonService.java package cn.cutter_point.service; import

【j2ee spring】10、整合SSH框架(3)

整合SSH框架(3) Spring4+hibernate4+Struts2的整合,整合完成后我会把这个项目上传上去,但是我的建议是最好还是自己在自己的电脑上自己整合一下,我不保证一定没问题 前面那个,我们已经基本整合了SSH框架,但是还是有一些小小的瑕疵, 比如:PersonAction.java里面的 //获取实例,方法1 ServletContext sc = ServletActionContext.getRequest().getSession().getServletContext()

【j2ee spring】11、整合SSH框架之添加一个成员

11.整合SSH框架之添加一个成员 1.我们写一个天机成员的jsp文件 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD H

【j2ee spring】8、整合SSH框架(1)

整合SSH框架(1) Spring4+hibernate4+Struts2的整合,整合完成后我会把这个项目上传上去,但是我的建议是最好还是自己在自己的电脑上自己整合一下,我不保证一定没问题 1.首先建立一个web项目 然后我们建立一个spring的配置xml文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schem

Struts2,Spring3,Hibernate4整合--SSH框架

Struts2,Spring3,Hibernate4整合--SSH框架(学习中) 一.包的导入 1.Spring包 2.Hibernate 包 3.struts 包 4.数据库方面的包及junt4的包 二.配置文件 1.beans.xml (具体要注意的已经注释到 xml 中了,目前整合了Spring 与 hibernate4 ) <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="h

手动整合ssh框架时的各种错误

因为自己配置时jar包版本不太对,AOP包不能用,因此声明事物管理无效,只能手动在方法中声明 1.报:AnnotationTransactionAttributeSource is only available on Java 1.5 and higher错误,错误的意思是注解式事物声明仅仅支持1.5及以上的jdk,言下之意为你的jdk版本过低, 实际上根本不是这回事,是因为用了1.8的jdk,及jdk版本太高,这在较低版本的Spring中会出现这种错误,要解决要么用最新的Spring,要么降低

android上传图片(及普通参数)到服务器(j2ee后台服务器,ssh框架)

最近项目中需要客户端往服务器传输图片,并且还需要附带一些普通参数,研究了几天,把结果记录下. 首先客户端可服务端进行通信一般都是有http请求来发送和接收数据,这里android中有两种HttpClient和HttpURLConnection,这两个都可以和后台服务器进行网络通信,但是如何选择哪个来进行文件传输呢? 谷歌官方是提倡我们使用HttpURLConnection来和服务器进行通信(这个是在android.jar中就有),HttpClient这个是org.apache.http.clie

使用 IDEA和Maven 整合SSH框架

1.创建web工程 一路next 下去就行.完成后,IDEA会自动构建maven工程. 2.创建如下项目结构 需要将 java文件夹设置为SourcesRoot目录,否则无法创建package 设置操作如下:选择文件夹,右击. 3.在pom.xml文件中引入框架包 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&

java之spring之整合ssh

这篇主要讲解spring + struts2 + hibernate : 目录结构如下: t_role t_user 1.新建 web项目 :spring_ssh 2.在 WebRoot/WEB-INF/lib 下 导入jar包 antlr-2.7.7.jar aopalliance.jar asm-3.3.jar asm-commons-3.3.jar asm-tree-3.3.jar aspectjweaver.jar commons-fileupload-1.2.2.jar commons