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;
}
}