java:struts2.3框架1(struts2快速配置,各文件之间的关系,基础代码简化版,XML中的通配符)
1.struts2快速配置:
A.到http://struts.apache.org下载struts2开发包struts-2.3.32-all.zip
B.新建web项目并添加struts2依赖的jar文件
C.在web.xml配置struts2核心控制器(核心过滤器)
D.在src下新建struts2的配置文件:struts.xml,并引入dtd(struts2-core-2.3.32.jar--àstruts-2.3.dtd)
E.编写业务逻辑Action(LoginAction)
package cn.zzsxt.action;
import com.opensymphony.xwork2.Action;
public class LoginAction implements Action {
//属性驱动:获取页面提交参数的值
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;
} @Override
public String execute() throws Exception {
if("admin".equals(userName)&&"admin".equals(password)){
return "success";
}
return "fail";
}
}
F.编写登陆页面login.jsp和登陆成功页面index.jsp
login.jsp
<form action="login.action" method="post">
用户名:<input type="text" name="userName"/><br>
密码:<input type="password" name="password"/><br>
<input type="submit" value="登录"/>
</form> index.jsp
<html>
<head>
<title>登陆成功</title>
</head> <body>
恭喜你,${userName}登陆成功!
</body>
</html>
G.在struts.xml配置action和result
<?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包:其作用类似java中包的概念,作用为:分类和避免命名冲突 -->
<package name="hello" extends="struts-default">
<action name="login" class="cn.zzsxt.action.LoginAction">
<result name="success">/index.jsp</result>
<result name="fail">/login.jsp</result>
</action>
</package>
</struts>
2.关系:
3.基础代码简化:
struts.xml:
<?xml version="1.0" encoding="UTF-8"?>
<struts>
<action name="login" class="cn.zzsxt.mystruts.action.LoginAction">
<result name="success">/index.jsp</result>
<result name="fail">/login.jsp</result>
</action>
<action name="add" class="cn.zzsxt.mystruts.action.AddAction">
<result name="success">/success.jsp</result>
<result name="fail">/add.jsp</result>
</action>
</struts>
XML解析:
package cn.zzsxt.mystruts.framework; import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map; import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; public class ActionMappingManager {
//封装struts.xml中所有的action节点信息,以action的name属性值做键,以action节点的信息做值
private Map<String,ActionMapping> actionsMap = new HashMap<String,ActionMapping>();
/**
* 解析src下的struts.xml配置文件
* 将action节点的信息封装成ActionMapping对象
* 将result节点信息封装成ResultMapping对象
*/
public void paserXml(){
SAXReader saxReader = new SAXReader();
//查找具有给定名称的资源,将src下的struts.xml转成输入流
InputStream ips =this.getClass().getResourceAsStream("/struts.xml");
try {
Document document = saxReader.read(ips);
//获取根节点
Element struts = document.getRootElement();
Iterator<Element> actionIter = struts.elementIterator();//获取子元素
while(actionIter.hasNext()){
Element action = actionIter.next();//action节点
String actionName = action.attributeValue("name");//获取action节点的name属性值
String actionClass = action.attributeValue("class");//获取action节点的class属性值
ActionMapping actionMapping = new ActionMapping(actionName,actionClass);//将name属性值和class属性值封装成actionMapping对象
Iterator<Element> resultIter = action.elementIterator();//获取result节点迭代器
while(resultIter.hasNext()){
Element result = resultIter.next();//获取result节点
String resultName = result.attributeValue("name");//获取result节点的name属性值
String resultPath = result.getText();//获取result节点的文本节点值
ResultMapping resultMapping = new ResultMapping(resultName,resultPath);//将Result节点信息封装成ResultMapping对象
actionMapping.getResultsList().add(resultMapping);//将resultMapping对象添加到actionMapping的集合中
}
//将action的节点信息添加到actionsMap中
actionsMap.put(actionName, actionMapping);
}
} catch (DocumentException e) {
e.printStackTrace();
}
} /**
* 根据action的name值查找action节点信息
* @param actionName
* @return
*/
public ActionMapping getActionByName(String actionName){
return actionsMap.get(actionName);
} public static void main(String[] args) {
ActionMappingManager actionMappingManager = new ActionMappingManager();
actionMappingManager.paserXml();//解析配置文件
ActionMapping actionMapping = actionMappingManager.getActionByName("login");
String actionName = actionMapping.getActionName();
String actionClass = actionMapping.getActionClass();
System.out.println(actionName+"----"+actionClass);
List<ResultMapping> list = actionMapping.getResultsList();
for (ResultMapping resultMapping : list) {
String resultName = resultMapping.getResultName();
String resultPath = resultMapping.getResultPath();
System.out.println(resultName+"****"+resultPath);
}
}
}
ActionServlet:
package cn.zzsxt.mystruts.framework; import java.io.IOException;
import java.util.List; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 1.核心控制器:拦截所有以.action结尾的用户请求,对地址栏进行截取
* http://localhost:8080/mystruts/login.action--->login
* 2.根据截取后的结果(login)到struts.xml配置文件中查找与其同名的action节点信息
* 3.获取action节点的class属性值(cn.zzsxt.mystruts.action.LoginAction),通过反射机制动态创建对象
* 4.利用多态执行action中的execute方法,返回逻辑名称(success/fail)
* 5.根据逻辑名称在struts.xml中的result节点查找同名的result节点信息
* 6.从result节点中获取文本节 点值(真实需要调整的路径),进行统一跳转
* @author Think
*
*/
public class ActionServlet extends HttpServlet {
ActionMappingManager actionMappingManager=null;
@Override
public void init() throws ServletException {
actionMappingManager = new ActionMappingManager();
actionMappingManager.paserXml();//解析配置文件struts.xml
} @Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取用户请求的地址栏
String uri = request.getRequestURI();// /mystruts/login.action
String actionName=uri.substring(uri.lastIndexOf("/")+1,uri.lastIndexOf("."));
System.out.println(actionName);
//根据截取后的结果从配置文件中查找对应的action节点信息
ActionMapping actionMapping = actionMappingManager.getActionByName(actionName);
//获取action节点的class属性值
String actionClass = actionMapping.getActionClass();
try {
//通过反射机制动态创建Action
Action action = (Action)Class.forName(actionClass).newInstance();
//执行action中execute方法,返回逻辑名称
String logicName = action.execute(request, response);
//根据逻辑名称查找配置文件,获取对于的result节点
List<ResultMapping> resultMappingList = actionMapping.getResultsList();//获取action的所有的result节点
for (ResultMapping resultMapping : resultMappingList) {
String resultName = resultMapping.getResultName();
String resultPath = resultMapping.getResultPath();//真实路径
if(resultName.equals(logicName)){
//跳转
request.getRequestDispatcher(resultPath).forward(request, response);
}
}
} catch (Exception e) {
e.printStackTrace();
}
} }
Action接口:
package cn.zzsxt.mystruts.framework; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public interface Action {
public String execute(HttpServletRequest request,HttpServletResponse response);
}
ActionMapping对象:
package cn.zzsxt.mystruts.framework; import java.util.ArrayList;
import java.util.List; /**
* 封装struts.xml配置文件中的action节点的信息
* @author Think
*
*/
public class ActionMapping {
private String actionName;//封装action节点的name属性值
private String actionClass;//封装action节点的class属性值
private List<ResultMapping> resultsList = new ArrayList<ResultMapping>();//封装了该action节点的所有result节点的信息 public ActionMapping(String actionName, String actionClass) {
this.actionName = actionName;
this.actionClass = actionClass;
} public ActionMapping(String actionName, String actionClass, List<ResultMapping> resultsList) {
this.actionName = actionName;
this.actionClass = actionClass;
this.resultsList = resultsList;
} public ActionMapping() { } public String getActionName() {
return actionName;
}
public void setActionName(String actionName) {
this.actionName = actionName;
}
public String getActionClass() {
return actionClass;
}
public void setActionClass(String actionClass) {
this.actionClass = actionClass;
}
public List<ResultMapping> getResultsList() {
return resultsList;
}
public void setResultsList(List<ResultMapping> resultsList) {
this.resultsList = resultsList;
} }
ResultSet对象:
package cn.zzsxt.mystruts.framework;
/**
* 封装struts.xml中result节点的信息
* @author Think
*
*/
public class ResultMapping {
private String resultName;//封装result节点的name属性值
private String resultPath;//封装result节点的文本节点的值 public ResultMapping(String resultName, String resultPath) {
this.resultName = resultName;
this.resultPath = resultPath;
} public ResultMapping() { } public String getResultName() {
return resultName;
}
public void setResultName(String resultName) {
this.resultName = resultName;
}
public String getResultPath() {
return resultPath;
}
public void setResultPath(String resultPath) {
this.resultPath = resultPath;
} }
AddAction:
package cn.zzsxt.mystruts.action; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import cn.zzsxt.mystruts.framework.Action; public class AddAction implements Action { @Override
public String execute(HttpServletRequest request, HttpServletResponse response) {
String userName = request.getParameter("userName");
String password = request.getParameter("password");
//利用jdbc执行用户新增
System.out.println("执行了用户新增:"+userName+"---"+password);
return "success";//逻辑名称
} }
LoginAction:
package cn.zzsxt.mystruts.action; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import cn.zzsxt.mystruts.framework.Action; public class LoginAction implements Action { @Override
public String execute(HttpServletRequest request, HttpServletResponse response) {
String userName = request.getParameter("userName");
String password = request.getParameter("password");
if("admin".equals(userName)&&"admin".equals(password)){
return "success";//逻辑名称
}
return "fail";//逻辑名称
} }
web.xml:
<?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" id="WebApp_ID" version="3.0">
<display-name>mystruts</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 核心控制器 -->
<servlet>
<servlet-name>actionservlet</servlet-name>
<servlet-class>cn.zzsxt.mystruts.framework.ActionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>actionservlet</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
4.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包:其作用类似java中包的概念,作用为:分类和避免命名冲突 -->
<package name="hello" extends="struts-default">
<action name="login" class="cn.zzsxt.action.LoginAction">
<result name="success">/index.jsp</result>
<result name="fail">/login.jsp</result>
</action>
<action name="add" class="cn.zzsxt.action.AddAction">
<result name="success">/success.jsp</result>
</action>
</package>
<!-- 通过method指定action中默认方法 -->
<package name="hello2" extends="struts-default">
<!-- method="制定默认调用的方法,如果不指定默认调用execute方法" -->
<action name="user-doList" class="cn.zzsxt.action2.UserAction" method="doList">
<result name="list">/list2.jsp</result>
</action>
<!-- method="制定默认调用的方法,如果不指定默认调用execute方法" -->
<action name="user-doAdd" class="cn.zzsxt.action2.UserAction" method="doAdd">
<result name="success">/list.jsp</result>
</action>
</package> <!-- 方法的动态调用(重要):利用*作为通配符,通过{n} n代表第几个通配符,必须为正整数并且从1开始 -->
<!-- user-doLogin *匹配的是doLogin, method="{1}" {1}代表第一个通配符:doLogin -->
<package name="hello3" extends="struts-default">
<!-- method="制定默认调用的方法,如果不指定默认调用execute方法" -->
<action name="user3-*" class="cn.zzsxt.action3.UserAction" method="{1}">
<result name="list">/list3.jsp</result>
<!-- type="结果类型"
dispatcher默认(请求转发)
redirectAction:重定向到action
redirect:重定向到结果视图(jsp)
-->
<result name="success" type="redirectAction">user3-doList</result>
</action>
</package>
</struts>
java:struts2.3框架1(struts2快速配置,各文件之间的关系,基础代码简化版,XML中的通配符)的更多相关文章
- Java后台处理框架之struts2学习总结
Java后台处理框架之struts2学习总结 最近我在网上了解到,在实际的开发项目中struts2的使用率在不断降低,取而代之的是springMVC.可能有很多的朋友看到这里就会说,那还不如不学str ...
- struts2 笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用
Struts2登录 1. 需要注意:Struts2需要运行在JRE1.5及以上版本 2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDis ...
- java:Springmvc框架1(基本配置,注解配置,转换器引入)
1.springmvc01:(基本配置) web.xml: <?xml version="1.0" encoding="UTF-8"?> <w ...
- java:Spring框架1(基本配置,简单基础代码模拟实现,spring注入(DI))
1.基本配置: 步骤一:新建项目并添加spring依赖的jar文件和commons-logging.xx.jar: 步骤二:编写实体类,DAO及其实现类,Service及其实现类; 步骤三:在src下 ...
- struts2(四) ognl表达式、值栈、actionContext之间的关系
今天来说说ognl表达式在struts2中的运用. --wh 一.什么是Ognl? 通过百度百科查询到的解释,其中详细的说明了OGNL的作用. 下面我们就对OGNL这5个作用进行讲解 1.存取对象的任 ...
- java:Mybatis框架1(基本配置,log4j,Junit4(单元测试))
1.mybatis01: db.properties: driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test userna ...
- struts2客户端与服务器端即jsp页面与action之间的关系
在Struts2中,客户端和服务器之间的数据传输全部要用到get.set方法:用set方法 ,可以将表单中的值存入Action类.通过Struts2.0标签,调用get方法将Action类中的结果数据 ...
- java练习题(字符串类):显示4位验证码、输出年月日、从XML中抓取信息
1.显示4位验证码 注:大小写字母.数字混合 public static void main(String[] args) { String s="abcdefghijklmnopqrstu ...
- sencha touch 框架的几种核心脚本文件之间的区别
sencha-touch-debug.js 供开发时用sencha-touch.js 供发布时用sencha-touch-all.js All 供不能使用SDK构建应用程序时,将 ...
随机推荐
- (转)shell中括号的特殊用法 linux if多条件判断
一. bash [ ] 单双括号 基本要素: Ø [ ] 两个符号左右都要有空格分隔 Ø 内部操作符与操作变量之间要有空格:如 [ “a” = “b” ] Ø 字符串比较中,&g ...
- eclipse查看jsp出现failed to create the part's controls的解决方法
问题描述 最近eclipse出现了一下问题,某个类无法打开,显示Failed to create the part’s controls ,如图: 问题解决 安装的JDK 版本估计有冲突导致IDE出现 ...
- IView 使用Table组件时实现给某一列添加click事件
通过给 columns 数据的项,设置一个函数 render,可以自定义渲染当前列,包括渲染自定义组件,它基于 Vue 的 Render 函数. render 函数传入两个参数,第一个是 h,第二个是 ...
- MySQL内联和外联查询
内连: 内连接是通过在查询中设置连接条件的方式,来移除查询结果集中某些数据行后的交叉连接.简单来说,就是利用条件表达式来消除交叉连接的某些数据行. 在MySQL FROM 子句中使用关键字 INNER ...
- 工作中常用的Linux命令:crontab命令,定时任务执行命令
本文链接:http://www.cnblogs.com/MartinChentf/p/6060252.html (转载请注明出处) crontab是一个用来设置.删除或显示供守护进程cron执行的定时 ...
- sql2014 日志太大 删除日志
首先,我们要确认日志的文件名,因为硬盘上的文件名不一定是数据字典里面的文件名,所以要确认下 USE test9572 GO SELECT file_id,name FROM sys.database_ ...
- Springboot 注册拦截器
拦截器 创建myInterceptor类 import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSer ...
- ReactJS 结合 antd-mobile 开发 h5 应用基本配置
在 ReactJS 较为初级的使用 antd-mobile 使用时候直接加载 node_modules 文件中的相关 CSS,这个使用方法效率低:更高明的方法则按需加载,需要设置如下: 在 packa ...
- CF1213D Equalizing by Division
easy version hard version 问题分析 直接从hard version入手.不难发现从一个数\(x\)能得到的数个数是\(O(\log x)\)的.这样总共有\(O(n\log ...
- JavaWeb_(session和application)用户登录注册模板_进阶版
用户登录注册模板_基础版 传送门 用户登录注册模板进阶版 添加了获得获得当前登录用户信息及存储登录人数 用户登录后,在首页.注册页.登录页显示登录用户信息和存储登录人数信息 目录结构 <%@pa ...