前段时间学过一下struts1,其实也就是配置web工程成功而已,但是过了一个多月后,当再想继续学习的时候,感觉和从头开始没有什么两样了,为什么?因为我没有总结,没有形成自己的一套体系。胡-哥说过,技术博客为什么要发表? 不发表就没有留存, 没有留存就没有记忆,没有记忆就没有历史,没有历史就没有存在,没有存在就没有意义!所以我决定了在以后的学习中都要把学到的东西记录下来,让这些见证自己的成长。
话说多了,前两天接触了struts2, struts2给我第一的感觉就是比struts操作简单,省去了很多步骤,更灵活(其实struts1我只是学过几天而已,感觉特别繁琐)。
今天就记录第一个怎么配置第一个struts工程。
1、 下载struts类库http://www.apache.org/ 我用的是2.1.6版本,myeclipse8.6
2、 创建web工程,将一些必要的类库拷贝到WebRoot目录的lib下。下载到的类库很多,其中必需的有7个:
(1)commons-fileupload-1.2.1.jar
(2)commons-io-1.3.2.jar
(3)commons-logging-1.0.4.jar
(4)freemarker-2.3.13.jar
(5)ognl-2.6.11.jar
(6)struts2-core-2.1.6.jar
(7)xwork-2.1.2.jar
3、编写配置文件struts.xml文件,此文件要放在src目录下
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <package name="struts2" extends="struts-default"> <action name="login" class="com.champion.action.LoginAction"> <result name="sucess">/index.jsp</result> </action> </package> </struts>
说明:struts2和strus1在配置文件就有很大的不同,它的配置信息比struts1简单多了,它一<struts>开头,里 面有<bean>,<struts>,<include>,<package>四个子标签,现在我只到到过<package>这个标签,所以就分析一下 这个标签的有什么用,<package>的name属性可以随便取,extents表示继承stuts-default.xml这个配置文件(这或许就是struts2配置信息比较简单吧,个人的猜想而已).<package>标签下也有很多个子标签,经常用到的是<action>,这个标签看它的名字就可以知道是什么意思了,在这里,我定义了一个name="login"的动作,它对应的类为
class="com.champion.action.LoginAction",<action>标签下有个<result>标签,它的作用就是在动作类处理后需要处理的结果。关于这个配置的文件就说这么多,以后再慢慢深入…
4、有了这配置文件还是不行的,必须得让tomcat知道有个文件,它才会把struts2的类库加载到内存来,所以还得在web.xml里面配置。
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" 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_2_5.xsd"> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> <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>
说明:这个文件的配置和struts1也有明显的不同,struts1采用的是动作控制的servlet来配置,而这个是通过过滤器来控制的,只要配置的有<filter>和<filter-mapping>这两个标签,其中的<filter-class>是固定的,<filter-name>要一致,否则将无法找到对应的过滤器,<url-pattern>/*<url-pattern>表示所以的请求都交给这个过滤器过滤。
5、编写LoginAction.java代码
package com.champion.action;
public class LoginAction {
private String username;
private String userpwd;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUserpwd() {
return userpwd;
}
public void setUserpwd(String userpwd) {
this.userpwd = userpwd;
}
public String execute() throws Exception {
return "sucess";
}
}
说明:这个动作类里面有两个属性username和userpwd以及他们的set和get方法,这两个属性名称要和页面的输入框name属性值相同,还有一个方法execute(),这个方法是struts2内置的,它返回一个字符串类型,当在页面请求login.acion时,它就会自动将页面的值赋给这两个属性。
6、编写login.jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<html>
<head>
<title>用户登录</title>
</head>
<body>
<form action="login.action" method="post">
用户名:
<input type="text" name="username" />
<br>
密 码:
<input type="password" name="userpwd" />
<br>
<input type="submit" value="提交" />
<input type="reset" value="重置" />
</form>
</body>
</html>
说明:可以看到两个输入框的name属性值和LoginAction类中的属性值一致,表单的action="login.action",当
表单提交时,后台就会调用LoginAction这个类。
7、编写index.jsp页面,表示登录成功后需要显示的页面
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<html>
<head>
<title>个人信息中心</title>
</head>
<body>
用户名:${requestScope.username }
密 码:${requestScope.userpwd }
</body>
</html>
说明:这个页面用来EL表达式来显示用户的信息,其他的不多说了。
8、启动工程,看结果,有图有真相。
在login.jsp页面输入如下:
提交后在index.jsp页面输出如下:
9、整个流程是怎么样的
说明:在index页面中的代码,用户名:${requestScope.username }
密 码:${requestScope.userpwd }
struts会自动调用LoginAction中的属性的get方法,最终显示在页面上。
10、小结一下
struts2刚接触几天,只是明白了这个整个流程,虽然自己很明白这个流程,但是很难用言语来准确的描述,就像上边的流程图一样,画了半个小时,最终的结果也不清不楚的,自己看这都晕,以后还是得多补充一下辅助工具使用方面的知识才行了,要做程序员就必须得用工具来表达自己的思想,要不技术再厉害,也可能无处施展(声明一下,我的技术不厉害)。