struts控制器使用流程:
1ActionServlet拦截用户请求
2.根据请求uri转发给相应的Action
3.Action处理业务逻辑返回一个字符串
4.在配置文件中查找Action返回字符串所对应的页面,然后跳转到该页面
已注册登录实现为例:
约定:
登录成功:Action返回"loginSuccess",重定向到index.jsp
登录失败:Action返回"loginFaild",跳转到login.jsp
注册成功:Action返回"registerSuccess",重定向到login.jsp
这里默认注册都能成功
实现过程:
1.实现用户类,dao层
User:
package entity; public class User { private String name; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
UserDao:2.实现Action:package Dao; import entity.User; public class UserDao { public User login(User user){ if("admin".equals(user.getName()) && "admin".equals(user.getPassword())){ return user; } return null; } public boolean register(User user){ return true; } }
LoginAction:
RegisterAction:public class LoginAction { public String Login(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException{ String uri = null; //初始化用户 User u = new User(); u.setName(request.getParameter("name")); u.setPassword(request.getParameter("password")); UserDao userDao = new UserDao(); User user = userDao.login(u); if(user == null){ uri = "loginFaild"; }else{ request.getSession().setAttribute("User", user); uri = "loginSuccess"; } return uri; } }
3.自定义配置文件:public class RegisterAction { public String Register(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException{ return "registerSuccess"; } }
<?xml version="1.0" encoding="UTF-8"?> <struts> <package> <!-- name指定次action响应的uri,class指定实现类,method指定实现方法 --> <action name="login" class="Action.LoginAction" method="Login" > <!-- name指定返回值,type指定使用重定向还是转发,默认为转发,文本域指定跳转页面 --> <result name="loginSuccess" type="redirect">/index.jsp</result> <result name="loginFaild">/login.jsp</result> </action> <action name="register" class="Action.RegisterAction" method="Register"> <result name="registerSuccess">/login.jsp</result> </action> </package> </struts>
4.解析配置文件:1)result类,对应action标签下的result标签内容:
public class Result { private String name; private String type; private String page; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getPage() { return page; } public void setPage(String page) { this.page = page; } }
2)ActionMapping类,对应资源文件根目录下action标签内容:3)资源文件解析类analysis,这里使用demo4j解析xml文件:public class ActionMapping { private String name; private String className; private String method; private Map<String,Result> results; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public String getMethod() { return method; } public void setMethod(String method) { this.method = method; } public Map<String, Result> getResults() { return results; } public void setResults(Map<String, Result> results) { this.results = results; } }
package bean; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class analysis { private Map<String,ActionMapping> Actions; public analysis(){ Actions = new HashMap<String,ActionMapping>(); this.init(); } public void init(){ try{ //获取解析器 SAXReader reader = new SAXReader(); //获取文件流 InputStream in = this.getClass().getResourceAsStream("/config.xml"); Document doc = reader.read(in); //获取根节点 Element struts = doc.getRootElement(); Element e_package = struts.element("package"); List<Element> ActionList = e_package.elements("action"); for(Element element:ActionList){ ActionMapping actionMapping = new ActionMapping(); actionMapping.setName(element.attributeValue("name")); actionMapping.setClassName(element.attributeValue("class")); actionMapping.setMethod(element.attributeValue("method")); Map<String,Result> results = new HashMap<String,Result>(); List<Element> result = element.elements("result"); for(Element e:result){ Result rs = new Result(); rs.setName(e.attributeValue("name")); rs.setType(e.attributeValue("type")); rs.setPage(e.getText()); results.put(rs.getName(), rs); } actionMapping.setResults(results); Actions.put(actionMapping.getName(), actionMapping); } }catch(Exception e){ e.printStackTrace(); } } public Map<String, ActionMapping> getActions() { return Actions; } public void setActions(Map<String, ActionMapping> actions) { Actions = actions; } public ActionMapping getActionMapping(String actionName){ if(Actions.isEmpty()) System.out.println("初始化失败"); if(actionName == null){ throw new RuntimeException("传如空路径"); } ActionMapping actionMapping = Actions.get(actionName); if(actionMapping == null){ throw new RuntimeException("没有这个路径"); } return actionMapping; } }
5.实现ActionServlet
public class ActionServlet extends HttpServlet{ private analysis AnalysisManager; public ActionServlet(){ AnalysisManager = new analysis(); } public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException{ String uri = request.getRequestURI(); String actionName = uri.substring(uri.lastIndexOf("/")+1,uri.lastIndexOf(".")); //System.out.println(actionName); //获得当前uri对应的Action ActionMapping actionMapping = AnalysisManager.getActionMapping(actionName); //获得处理请求的方法 String m = actionMapping.getMethod(); String className = actionMapping.getClassName(); /* * 通过反射创建对象调用方法 */ try { Class<?> clazz = Class.forName(className); Object obj = clazz.newInstance(); Method method = clazz.getDeclaredMethod(m,HttpServletRequest.class,HttpServletResponse.class); String returnuri = (String)method.invoke(obj, request,response); Result result = actionMapping.getResults().get(returnuri); String type = result.getType(); String page = result.getPage(); if("redirect".equals(type)) response.sendRedirect(request.getContextPath()+page); else request.getRequestDispatcher(page).forward(request, response); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException{ doGet(request,response); } }
web.xml,因为这儿没想到好的方法区分login和register就给Servlet设置了*.do的映射,login请求login.do,register1请求rigister.do这样就可以通过截取requestUri来区分login和register:
<?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_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>strutsDemo</display-name> <servlet> <servlet-name>ActionServlet</servlet-name> <servlet-class>servlet.ActionServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ActionServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>