<!--?xml version="1.0" encoding="UTF-8"?-->
<!-- 定义约束文件 -->(标注)
<!-- ELEMENT 表示元素 -->
<!-- ATTLIST 表示属性 -->
<!-- CDATA 表示字符串类型 -->
<!-- REQUIRED 表示此属性必须的写 -->
<!-- *代表多个 -->
<!-- IMPLIED 表示此属性可写 -->
<!-- redirect 重定向或转发 -->
<!--ELEMENT actions (action)-->
<!--ELEMENT action (result*)-->(*表示可以多个)
<!--ATTLIST action name CDATA #REQUIRED
class CDATA #REQUIRED
-->
<!--ATTLIST RESULT name CDATA #IMPLIED
redirect (true|false) "false"
-->
]>
<framework>
<!-- 进行测试 -->
<actions>
<action name="loginAction" class="cn.hq.Action.LoginAction">
<result name="success">success.jsp</result>
<result name="login">index.jsp</result>
</action>
</actions>
</framework>
/*
* action节点不止一个
* 用来来管理ActionMapping类
*/
public class ActionMappingManager {
//actionMapping类的集合
private Map<String,ActionMapping> maps=new HashMap<String,ActionMapping>();
public ActionMapping getActionMapping(String name)
{
return maps.get(name);
}
//解析在src项目下的所有配置文件
//实例化完毕后进行解析
public ActionMappingManager(String[] file){
for (String filename : file) {
Init(filename);
}
}
//init初始化方法
//解析xml文档
public void Init(String path){
try {
InputStream is=this.getClass().getResourceAsStream("/"+path);
//解析xml
Document doc=new SAXReader().read(is);
//获取根节点
Element root = doc.getRootElement();
//获取actions节点
Element actions=(Element)root.elementIterator("actions").next();
//使用for循环来遍历actions节点下的所有action节点
for(Iterator<Element> action=actions.elementIterator("action");action.hasNext();)
{
//获取到<action>节点
Element actionnext = action.next();
//分别获取到action节点中的name属性和class属性
String name = actionnext.attributeValue("name");
String classname = actionnext.attributeValue("class");
//将以上两个属性保存到ActionMapping类中
ActionMapping mapp=new ActionMapping();
mapp.setClassname(classname);
mapp.setName(name);
//由于一个action节点下有多个result节点 遍历action下所有的result节点
for(Iterator<Element> result=actionnext.elementIterator("result");result.hasNext();)
{
//获取到result节点
Element resultnext = result.next();
//提取result节点的name属性值和result节点中的值
String resultname = resultnext.attributeValue("name");
String resultvalue=resultnext.getText();
//将其分别存入到actionMapping中的双列集合中去,方便调用actionMapping类(actionMapping类中就有数据了!)
mapp.addResult(resultname, resultvalue);
System.out.println(mapp.getName());
}
//得到所有action节点的集合
maps.put(mapp.getName(), mapp);
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
public class ActionManager {
public static Action getActionClass(String classname)
{
Class clazz=null;
Action action=null;
//获取当前线程的类加载器
try {
//如果线程中的有那么一个类,直接根据类名获取该类的类型
clazz=Thread.currentThread().getContextClassLoader().loadClass(classname);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(clazz==null)
{
try {
//如果该线程中没有,那么使用class.forname方法获取
clazz=Class.forName(classname);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(action==null)
{
try {
//将获取到的类型转换为action,调用无参构造函数,某种程度上相当于new,不过new需要指定类型
action=(Action)clazz.newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return action;
}
}
public class MyServlet extends HttpServlet {
/**
*你很菜
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}<br>
/**
*继续努力
*/
ActionMappingManager man=null;
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取ActionMapping对象
ActionMapping actionMapping = man.getActionMapping(getPath(request));
//获取action接口反射机制
Action action = ActionManager.getActionManager(actionMapping.getClassname());
try {
String message=action.execute(request, response);
String results = actionMapping.getResults(message);
response.sendRedirect(results);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 获取请求的路径名
*/
public String getPath(HttpServletRequest request){
//项目+请求地址
String requestURI = request.getRequestURI();
//项目名称
String contextPath = request.getContextPath();
//具体请求
String path = requestURI.substring(contextPath.length());
String filename = path.substring(1,path.lastIndexOf("."));
return filename;
}
/*
*重写init,程序运行加载所有类
*
*/
@Override
public void init(ServletConfig config) throws ServletException {
//config对象是javax.servlet.ServletConfig的对象,功能是获得初始化配置信息
//config.getInitParameter是取得指定名称的初始化参数内容
String filename = config.getInitParameter("config");
String [] filenames=null;
if(filename==null){
//如果为空 ,
filenames=new String[]{"Framework.xml"};
}else{
//若果有其他的配置参数信息,那么以,分隔存入数组中
filenames=filename.split(",");
}
//使用init方法进行初始化
man=new ActionMappingManager(filenames);
}
}
public class LoginAction implements Action{
@Override
public String execute(HttpServletRequest request,
HttpServletResponse response) throws Exception {
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
if(name.equals("1")&&pwd.equals("1")){
return SUCCESS;
}else{
return LOGIN;
}
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有