使用反射类自定义一个简单的Struts1框架

1.login.jsp
<form action="login.do">
用户名:<input type="text" name="userName"><br>
密码:<input type="text" name="password"><br>
<input type="submit"  value="提交">
2.定义接口Action
package com.wjj.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface Action {
public String execute(HttpServletRequest request,HttpServletResponse response); 
}
3.定义LoginAction类并实现上面所定义的接口
package com.wjj.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.wjj.controller.Action;

public class LoginAction implements Action {
 @Override
 public String execute(HttpServletRequest request,
   HttpServletResponse response) {
  System.out.println(request.getParameter("userName"));
  return "success.jsp";
 }
}
4.新建ActionServlet
package com.wjj.controller;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.wjj.action.LoginAction;

/**
 * Servlet implementation class ActionServlet
 */
public class ActionServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
         //新建一个Map,用于使用键值对
 // Map actionMap =new HashMap();
 
  //第二种方式定义bean工厂类对象
     BeanFactory  bf;
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ActionServlet() {
        super();
    }

 /**
  * @see Servlet#init(ServletConfig)
  */
 public void init(ServletConfig config) throws ServletException {
  //在初始化时,设置键值对
  //actionMap.put("login", new LoginAction());
  
  //第二种方式初始化时,读取配置文件
      bf =new BeanFactory("E://bean.xml");
 }

 /**
  * @see Servlet#destroy()
  */
 public void destroy() {
  // TODO Auto-generated method stub
 }

 /**
  * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  String path =request.getServletPath();// 获取路径  /login.do
  System.out.println(path);
  String actionName =path.substring(path.indexOf("/")+1, path.length()-3); // 截取路径
  System.out.println(actionName);
  //Action action =(Action)actionMap.get(actionName);//实现多态
  //第二种方式使用反射类的方式
  Action action =(Action)bf.getBean(actionName); 
  String result =action.execute(request, response);
  request.getRequestDispatcher(result).forward(request, response);
 }

 /**
  * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
 }

}
5.web.xml中
  <servlet>
    <description></description>
    <display-name>ActionServlet</display-name>
    <servlet-name>ActionServlet</servlet-name>
    <servlet-class>com.wjj.controller.ActionServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ActionServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
6.工厂类factoryBean
package com.wjj.factory;
import java.io.FileInputStream;
import java.util.Properties;
public class BeanFactory {

 //properties是map的子类
 private Properties pros = new Properties();
 public BeanFactory(String fileName) {
  //通过路径fileName扫描资源文件
  FileInputStream fis;
  try {
   fis = new FileInputStream(fileName);
   pros.load(fis);
  } catch (Exception e) {
   e.printStackTrace();
  }
 } 
 public Object getBean(String beanName) {
  String className = pros.getProperty(beanName);
  Object obj = null;
  //Class实例用于到文件扫描,将信息装载到该实例中
  Class clazz;
  try {
   //找到并返回一个类存储在类型为Class的类里
  clazz = Class.forName(className);//查找到资源文件中的"com.wjj.action.LoginAction"
   obj = clazz.newInstance();//实例化该类"com.wjj.action.LoginAction"
  } catch (Exception e) {
   e.printStackTrace();
  }
  return obj;
 }
}

猜你喜欢

转载自jiajunwu.iteye.com/blog/1910772