Struts2项目的构建与配置1.配置struts.xml(1)配置struts.xml可以参考下载的struts-2.3.14.1-all.zip解压后的apps文件夹下的参考项目的struts.xml文件。
(2)主要的配置如下:<constant name="struts.devMode"value="true"/><package name="hello"namespace="/"extends="struts-default"><action name="hello"><result>/hello.jsp</result></action></package><constant name="struts.devMode"value="true"/> value="true"表示是开发模式,当修改了配置时服务器会自动加载修改后的配置,不需要中期服务器,方便开发。
(3)namespace="/"与浏览器的访问地址有关,namespace的默认值为空。
(4)<action name="hello"><result>/hello.jsp</result></action> action的name值与浏览器的访问地址有关,当地址是“http://…/hello”时,浏览器就会返回result中的hello.jsp 的页面。
2.配置web.xml(1)配置web.xml也可以参考下载的struts-2.3.14.1-all.zip解压后的apps文件夹下的参考项目的web.xml文件(2)主要配置如下:<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>3.配置Struts2的jar包(1)复制下载的struts-2.3.14.1-all.zip解压后的apps文件夹下的参考项目的WEB-INF\lib文件夹下的所有的jar包到我们自己项目的WEB-INF\lib文件夹下即可。
Struts.xml的配置1.package的属性与配置(1)package的使用说明:类似于Java程序里的package,主要用于区分同名的action。
在真正的项目开发中package通常来区分不同的模块。
例如:<package name="hello"namespace="/login"extends="struts-default">…</package>(2)name属性:用于区分不同的package,此属性不能省略不写。
(3)extends属性:用于继承其他的package,继承了某个package就包含了某个package里的所有配置,此属性可以省略不写,默认继承struts-default。
(4)namespace属性:表示浏览器访问的路径,此属性可以省略不写,默认为空,当此属性为空时,该package里的action可以匹配浏览的任何请求的action。
(5)abstract属性:此属性的值为false表示此package非抽象的,若为true表示此package为抽象的。
2.action的属性与配置(1)action的使用说明:action是配置在package里的,一个package可以配置多个action,每一个action都可以处理一种请求,通常一个action就是一个含有public String execute()方法的Java类,根据execute方法的不同的返回值来返回相应的页面给用户。
例如:<action name="hello"class="login.Hello" method="execute">…</action>(2)name属性:定义action的名称,也表示浏览器访问的路径。
(3)class属性:定义该action所对应的具体的Java类,其值是具体的Java类的路径。
(4)method属性:定义该action调用Java类的具体方法,调用的方法的返回类型必须是String类型,如果用户没有定义该属性,则默认调用execute方法。
(5)method动态方法调用(BMI)可以在浏览器地址栏里动态的指定调用action的那一个方法,如:http://localhost:8080/Struts2/hello/hello!add。
调用格式为:http://…/action名!方法名(6)使用通配符动态调用action及其方法并动态的返回页面例如:<package name="hello"namespace="/hello"extends="struts-default"><action name="hello_*"class=" com.lzw.HelloAction"method="{1}"><result name="hello">/hello_{1}.jsp</result></action><action name="*_*"class="com.lzw.{1}Action"method="{2}"><result>/{1}_{2}.jsp</result></action></package>第一个action所对应的Java类已确定是:com.lzw.HelloAction。
但是对于不同的请求会调用该Java类里的不同的方法,并返回不同的页面,如:http://…/hello/hello_add,会调用add()方法,并返回hello_add.jsp页面;若想调用execute()方法,就会返回hello_execute.jsp页面,对应的请求就是:http://…/hello/hello_execute。
第二个action所对应的Java类并未确定,此action更为灵活,会根据不同的请求调用不同的action(即:Java类)以及其不同的方法,并返回不同的页面。
如在浏览器的地址栏输入:http://…/hello/User_add,就会调用erAction类里的add()方法,并返回User_add.jsp页面。
注意:在项目开发的时候一定要谨记“约定优于配置”原则,要约定好各个文件、方法以及类的起名规则!!!(7)请求向action传递参数例如:action里含有两个属性name与age,并且含有相应的get与set方法,则请求:http://…/hello/hello_add?name=lizhiwei&age=12,会把“lizhiwei”与“12”通过set方法赋值给name与age。
当action里还有一个属性u而且这个属性不是基本类型,而是User类型(用户自定义类型),该类型里也含有name与age属性和相应的set与get方法,若要通过请求的方式给u对象赋值,则请求如下:http:// …/hello/hello_add?name=lizhiwei&age=12&=li&u.age=13,该请求会使得u的name属性值为li,age值为13。
注意:通过这种方法一定要定义好相应的set与get方法,否则无法传值!!!(8)action实现ModelDriven<T>接口,进行参数传递例如:当一个action里含有一个属性u而且这个属性不是基本类型,而是User类型(用户自定义类型),该类型里也含有name与age属性和相应的set与get方法,若要通过请求的方式给u对象赋值;由于action实现了ModelDriven<T>接口,就会重写getModel()方法,此时在action里就不需要写属性u的set与get方法,但是需要用new来创建u 对象(而不是Struts2自动创建)。
请求:http://…/hello/hello_add?name=li&age=13,会把u的name属性赋值为li,age属性赋值为13。
重写getModel()方法的代码如下:public User getModel(){return u;}(9)参数传递的乱码简单解决方式:在struts.xml配置如下代码:<constant name="struts.i18n.encoding"value="UTF-8"></constant>根据配置value的值来配置编码,但是请求方式应尽量使用post,避免使用get。
注意:此方式在某些Struts2版本中使用时并不能解决问题,是因为那些版本存在bug。
本次实验使用的是struts-2.3.14.1版本,能够成功解决乱码问题!(10)action的简单数据验证如果action需要对接收到的参数进行验证,而要把验证到的信息返回给页面显示,常用且简单的做法是让此action继承ActionSupport,并在方法里增加相应验证代码,例如:public String add(){if(name==null || "".equals(name)){this.addFieldError("name", "参数不能为空!");}return"hello";}其中的this.addFieldError("name", "参数不能为空!")就是向Value Stack Contents里添加错误信息(也可以向一个参数名添加多个错误信息),添加的信息可以在页面里取出来。