标签:struts2 helloworld web.xml filter javaweb
许多网上的教程对Struts2的配置、安装弄得不明不白,很多高手以为小白是什么都懂,许多细节上面的地方没有说明清楚,甚至还有在Maven上面讲解的,要知道Struts2跟Maven没有半点的关系,完全可以像其它的javaweb插件那样在web.xml并且启动,同时复制那些包又没有说清楚,以致于按照各种教程的web.xml写好,之后,运行Tomcat一堆的错误,永远卡在Dispatcher initialization failed上面,半天出不来。弄得只好在已经配置好Struts的工程里面,直接拷贝一个WEB-INF过来,到头来终究没有学会如何配置Struts2。然后,Struts2的例子杂糅许多国际化的东西在里面,让人一头雾水。
一、基本目标
利用Eclipse for Javaee建立如下的一个Struts2简单工程,在文本框输入完东西,立即显示:
这里不可能跟你做一个用户登录系统然后查表来说明Struts2,因为Struts2只是Servlet的一个框架,它代表只是扮演JSP与JAVA文件交互的角色。
二、基本准备
1、在Eclipse for Javaee里面新建一个Web工程,带web.xml文件的。不懂可以参考《【Javaweb】Eclipse for JavaEE新建的Web工程自动生成web.xml》(点击打开链接)
2、直接在Struts2的官网(点击打开链接)下载最新版的Struts2,选择其中的Full版本,理论上只下载lib版本也可以,但是不知道会不会少了东西,而且最主要是笔者的网络下载lib版没有资源,所以直接下载Full版本,打开速度可能比较慢,也可以把http://222.200.129.45/mirrors.cnnic.cn/apache//struts/2.3.20/struts-2.3.20-all.zip这个下载地址复制到下载工具里面直接下载。
2、下载之后解压把lib中的如下的jar包复制到你web工程的lib文件里面,不要抱有为了省时间,或者什么的,把lib中的所有包,复制到网络工程的幻想。这样反而启动不了工程,即使web.xml写好了,也会有Dispatcher initialization failed的问题。估计是包冲突的原因吧。只复制如下九个jar过去,笔者亲测能够顺利启动工程。
3、对web工程的web.xml文件写入如下代码,之所以使用过滤器,不是说要拦截什么页面,意思是要求所有页面都实现struts2的特性,拦截器的作用,具体可以参见《【Filter】拦截器Filter》(点击打开链接),这段代码在struts2官方提供的文档中没有提供,从网上趴下来的,struts2以web.xml方法来做,不用maven,都这样写,同时请辨别网上那些struts1方法,struts1的web.xml写法是启动不了struts2的:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
三、基本思想
下面开始建立一个Helloworld的Struts2,本工程的最终目录结构如下图:
四、制作过程
1、首先建立一个index.jsp页面,非常简单,一个简单得不能再简单的表单,这里值得注意的是action的指向是calculation,然后使用到EL表达式,取出一会儿传递过来的id值,EL表达式,可以参考《【Filter】利用过滤器Filter解决post传递的编码问题与利用EL表达式简化参数传递》(点击打开链接),很简单的东西,只是为了不用写那么长的jsp代码
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>index</title> </head> <body> ${id} <form method="post" action="calculate"> <input type="text" name="id" /><br> <input type="submit" value="go" /> </form> </body> </html>2、右击src文件夹,选择新建其它文件。
3、在弹出的窗口输入xml文件,找到并且必须命名为struts.xml,这将是以后控制action跳转的文件
4、在struts.xml里面写入如下代码,意思为在test包中,刚才calculate那个action将会跳转到test包下面的a.java中的b方法处理。处理完之后,如果b放回的是success,那么就跳转回index.jsp
struts要求所有java文件必须处于包的下面,不得外露于根目录,那只好新建一个test包,在于里面写个a文件咯。部分介绍struts2的书籍很不负责任,说,每一个java必须要有默认的execute方法,其实不是的,你可以自己指定方法。
<?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> <package name="test" extends="struts-default"> <action name="calculate" class="test.a" method="b"> <result name="success">/index.jsp</result> </action> </package> </struts>5、a.java代码如下,这个Java文件我也不想写得这么复杂的,但是struts要求这样写的。
package test; import com.opensymphony.xwork2.ActionSupport; public class a extends ActionSupport { private String id; public String getId() { return id; } public void setId(String id) { this.id = id; } public String b() { System.out.println("hello," + id); return SUCCESS; } }首先,所有Action所对应的java文件,必须引入struts2包,表明这是一个struts2的action:
import com.opensymphony.xwork2.ActionSupport;其次所有方法必须继承ActionSupport类,
并且,为了接住index.jsp穿过来的name="id"的文本,你必须为这个id定义一个静态成员,然后设置相应的getter与setter方法,这才相当于Servlet里面的
request.getParameter("id");
然后快捷键R,就会出现如下的界面,为静态成员如下所示的自动创建Setter与Getter:
然后定义一个带字符串返回值的方法B,在里面写入一个打印到控制台的语句,本工程执行的时候,便会在控制台中打印出传过来的变量:
之后返回一个SUCCESS变量,相当于一个"success"字符串,这东西在父类里面就已经定义好了。
五、总结
做到这里,整个Struts2简单的Helloworld就做完了,返回SUCCESS之后,Struts2会又把这个id放到request容器里面,前台取值就能够马上取到。整个传值过程如下所示,有点乱,但综合上面的制作过程,大家应该能够看懂……
【Struts2】Struts2纯手工安装、配置以及Helloworld,以最新版struts 2.3.20 GA做例子
标签:struts2 helloworld web.xml filter javaweb
原文地址:http://blog.csdn.net/yongh701/article/details/44277309