Java Web : Struts2第一个简单例子 浅解
[环境:myeclipse8+jboss5]
先看一下最终的目录结构:
(如图,有7个导入的.jar包,它们在默认的myeclipse安装目录下,
我的是:D:\MyEclipse-8.6\configuration\org.eclipse.osgi\bundles\109\1\.cp\data\2.1\core)
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"> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </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> <login-config> <auth-method>BASIC</auth-method> </login-config></web-app>
解析:在web.xml中以前主要就是servlet标签,现在是filter完成过滤请求的功能。/*是通配符,表示任何请求都要经过此filter先处理。(注:在此例中它未被赋予作用)
login.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <body> <form action="login.action" method="post"> username:<input type="text" name="username" /><br/> password:<input type="password" name="password" /><br/> <input type="submit" value="提交" /> </form> </body></html>
解析:action="login.action" ,默认的是以.action结尾,提交的请求信息"username"、"password"交由下面的LoginAction类处理。
package com.test.action;public class LoginAction { private String username; private String password; public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;} public String execute()throws Exception{return "success";}}
解析:使用Action类控制导航业务数据,根据上面客户端login.jsp提交的信息,编写出两私有实例属性"username"、"password"及相应的getter/setter方法。
当客户端提交过来信息时,自动调用Action类的set方法,set到实例属性里面去。login.jsp中定义了username那么就
在LoginAction类中去寻找setUsername()方法,而非去比对属性名字。
此类由Struts框架自动调用,来完成客户端发送过来信息的处理,完成赋值set取值get;之后再自动调用execute()方法。
result.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <body> username:${requestScope.username }<br/> password:${requestScope.password } </body></html>
解析:这是提交请求之后显示的页面。${requestScope.username} 即获取request范围内的username用户名值。
struts.xml:(对于汉字传值不显示问题,注意要加上<constant name="struts.i18n.encoding" value="gb2312"/>在<struts></struts>内)
<?xml version="1.0" encoding="gb2312"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd"><struts><package name="struts2" extends="struts-default"><action name="login" class="com.test.action.LoginAction"><result name="success">/result.jsp</result></action></package></struts>解析:package标签 name="包名(此指web项目名)" 它继承自包struts-default
运行流程:
当提交请求(login.jsp)时,它会提交到“login.action”,.action会由struts2进行自动处理, 它找到.action前面的名字login,匹配到struts.xml中action标签的name属性,接着由action标签中 class属性对应的Action类生成实例对象来处理login.action,这时LoginAction类发现客户端发送 过来的请求,自动set方法赋值,接着自动执行execute()方法,返回字符串"success",这就是result 标签中name属性的值,也就是说这个name属性匹配execute()方法的返回值后才会跳转到result.jsp页面。