使用Struts1完成用户登录功能
1、Struts框架
框架(framework):就是一系列代码和开发模式的整合,使用框架后,所有开发人员都会按照框架提供的规范进行开发,使代码更容易维护和扩展。
使用框架的优点:
1) 易于维护扩展
2) 简化代码
Struts框架是MVC模式的具体实现框架,实现针对MVC模式中的Servlet以及jsp页面代码的简化。
JSP + Servlet 的执行流程:
jsp à web.xml中查找<servlet-mapping>找到进入哪个Servlet à 执行doGet或doPost方法,接收参数,验证,整合,调用service,设置属性,跳转 à 返回jsp。
Struts执行流程中主要修改了Servlet部分,不需要再编写Servlet,但需要建立Action和ActionForm,将Servlet中主要实现的功能也拆分为两部分,其中对于参数的处理交给ActionForm来执行,其他操作由Action实现。
在jsp页面上,不再使用JSTL,改为Struts-Taglib,可以替代JSTL标签完成循环,判断,格式化等操作,并扩展了新的功能,替代原有页面表单,形成动态表单,支持自动回填功能。
Struts不对数据库操作代码产生任何影响,DAO还是使用原有的JDBC。
2、使用Struts完成用户登录功能
假设用户输入用户名为zhangsan,密码为123表示登陆成功,否则登陆失败。
建立项目,加入Struts1.3支持。
加入支持后,项目中多出以下内容:
1) src下的资源文件(ApplicationResources.properties)
2) 支持类库
3) struts-config.xml
web.xml中加入ActionServlet配置
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 3 <display-name /> 4 5 <!-- Struts的配置 --> 6 <servlet> 7 <servlet-name>action</servlet-name> 8 <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> 9 <init-param> 10 <!-- 可以配置多个配置文件,中间使用逗号隔开 --> 11 <param-name>config</param-name> 12 <param-value>/WEB-INF/struts-config.xml</param-value> 13 </init-param> 14 <init-param> 15 <param-name>debug</param-name> 16 <param-value>3</param-value> 17 </init-param> 18 <init-param> 19 <param-name>detail</param-name> 20 <param-value>3</param-value> 21 </init-param> 22 <load-on-startup>0</load-on-startup> 23 </servlet> 24 <servlet-mapping> 25 <servlet-name>action</servlet-name> 26 <url-pattern>*.do</url-pattern> 27 </servlet-mapping> 28 29 30 <welcome-file-list> 31 <welcome-file>index.jsp</welcome-file> 32 </welcome-file-list> 33 </web-app>
如果想不使用MyEclipse加入支持,可以从apache官方网站上下载开发包,从开发包中找到这些配置,并加入项目。
在index.jsp中导入struts的html标签,并完成登陆表单
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %> 3 <% 4 String path = request.getContextPath(); 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 6 %> 7 8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 9 <html> 10 <head> 11 <base href="<%=basePath%>"> 12 13 <title>登陆页面</title> 14 <meta http-equiv="pragma" content="no-cache"> 15 <meta http-equiv="cache-control" content="no-cache"> 16 <meta http-equiv="expires" content="0"> 17 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 18 <meta http-equiv="description" content="This is my page"> 19 <!-- 20 <link rel="stylesheet" type="text/css" href="styles.css"> 21 --> 22 </head> 23 24 <body> 25 <html:form method="post" action="login.do" > 26 <br>用户ID:<html:text property="userid"></html:text> 27 <br>密码:<html:password property="password"></html:password> 28 <br><html:submit value="登陆"></html:submit> 29 </html:form> 30 </body> 31 </html>
改为标签形式,其中property就是之前普通元素的name。
下面建立提交后接收信息和处理的ActionForm与Action
path表示进入此Action以及ActionForm的提交路径,以 / 开头。
Input Source表示出错后自动跳转的错误页路径。
Finish完成后,会在struts-config.xml中自动生成配置
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd"> 3 4 <struts-config> 5 <form-beans > 6 <!-- 配置的LoginForm --> 7 <form-bean name="loginForm" type="lq.wangzhen.struts.form.LoginForm" /> 8 </form-beans> 9 10 <global-exceptions /> 11 <global-forwards /> 12 <action-mappings > 13 <!-- Action配置选项,指定对应的跳转路径path,错误路径input,和对应的form name --> 14 <action 15 attribute="loginForm" 16 input="/index.jsp" 17 name="loginForm" 18 path="/login" 19 scope="request" 20 type="lq.wangzhen.struts.action.LoginAction" 21 cancellable="true" /> 22 </action-mappings> 23 24 <message-resources parameter="lq.wangzhen.struts.ApplicationResources" /> 25 </struts-config>
先编写ActionForm接收参数,并验证。
1 /* 2 * Generated by MyEclipse Struts 3 * Template path: templates/java/JavaClass.vtl 4 */ 5 package lq.wangzhen.struts.form; 6 7 import javax.servlet.http.HttpServletRequest; 8 9 import org.apache.struts.action.ActionErrors; 10 import org.apache.struts.action.ActionForm; 11 import org.apache.struts.action.ActionMapping; 12 import org.apache.struts.action.ActionMessage; 13 public class LoginForm extends ActionForm { 14 /** 15 * 变量名称和表单中的变量名称一致,会自动的进行接收,但要编写对应的setter和getter方法 16 */ 17 private String userid; 18 private String password; 19 20 public ActionErrors validate(ActionMapping mapping, 21 HttpServletRequest request) { 22 //验证用户名和密码是否为空 23 ActionErrors errors = new ActionErrors(); 24 if(userid == null || "".equals(userid.trim())){ 25 errors.add("useridErr",new ActionMessage("userid.null")); 26 } 27 if(password == null || "".equals(password.trim())){ 28 errors.add("passwordErr", new ActionMessage("password.null")); 29 } 30 return errors; 31 } 32 public void reset(ActionMapping mapping, HttpServletRequest request) { 33 // TODO Auto-generated method stub 34 } 35 public String getUserid() { 36 return userid; 37 } 38 public void setUserid(String userid) { 39 this.userid = userid; 40 } 41 public String getPassword() { 42 return password; 43 } 44 public void setPassword(String password) { 45 this.password = password; 46 } 47 48 }
validate方法会在接收完参数后由Struts自动调用,验证返回的ActionErrors里如果包含了错误信息,则Struts会自动根据配置的错误页跳转回页面,而不进入Action。
错误信息通过ActionMessage,从资源文件中查找。
ApplicationResources.properties
1 userid.null=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A\uFF01 2 password.null=\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A\uFF01
资源文件中不允许出现中文,因此必须对中文进行转码。
在index.jsp中,提示错误信息
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %> 3 <% 4 String path = request.getContextPath(); 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 6 %> 7 8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 9 <html> 10 <head> 11 <base href="<%=basePath%>"> 12 13 <title>登陆页面</title> 14 <meta http-equiv="pragma" content="no-cache"> 15 <meta http-equiv="cache-control" content="no-cache"> 16 <meta http-equiv="expires" content="0"> 17 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 18 <meta http-equiv="description" content="This is my page"> 19 <!-- 20 <link rel="stylesheet" type="text/css" href="styles.css"> 21 --> 22 </head> 23 24 <body> 25 <html:form method="post" action="login.do" > 26 <br>用户ID:<html:text property="userid"></html:text> 27 <font color="red"><html:errors property="useridErr"/></font> <!-- 配置用户名错误信息 --> 28 <br>密码:<html:password property="password"></html:password> 29 <font color="red"><html:errors property="passwordErr"/></font> <!-- 配置密码错误信息 --> 30 <br><html:submit value="登陆"></html:submit> 31 </html:form> 32 </body> 33 </html>
在property中传入之前加入错误时设置的key值,就可以取得该错误信息并显示。
如果没有加property,则会取得所有错误信息并显示。
进入Action,在Action中实现其他的操作。
1 /* 2 * Generated by MyEclipse Struts 3 * Template path: templates/java/JavaClass.vtl 4 */ 5 package lq.wangzhen.struts.action; 6 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 10 import lq.wangzhen.struts.form.LoginForm; 11 12 import org.apache.struts.action.Action; 13 import org.apache.struts.action.ActionErrors; 14 import org.apache.struts.action.ActionForm; 15 import org.apache.struts.action.ActionForward; 16 import org.apache.struts.action.ActionMapping; 17 import org.apache.struts.action.ActionMessage; 18 19 public class LoginAction extends Action { 20 public ActionForward execute(ActionMapping mapping, ActionForm form, 21 HttpServletRequest request, HttpServletResponse response) { 22 LoginForm loginForm = (LoginForm) form; 23 if(loginForm.getUserid().equals("wangzhen") && loginForm.getPassword().equals("123")){ 24 //登陆成功 25 request.getSession().setAttribute("userid", loginForm.getUserid()); 26 //跳转到成功也,这里只给出名称,具体的路径配置到struts-config.xml中 27 return mapping.findForward("success"); 28 }else{ 29 //登陆失败,自动返回到失败页 30 //还需要保存错误信息 31 ActionErrors errors = new ActionErrors(); 32 errors.add("loginErr", new ActionMessage("login.err")); 33 //手工保存错误信息 34 super.saveErrors(request, errors); 35 return mapping.getInputForward(); 36 } 37 } 38 }
这里配置了跳转路径,需要修改struts-config.xml,将success的路径配置上。
1 <!-- Action配置选项,指定对应的跳转路径path,错误路径input,和对应的form name --> 2 <action 3 attribute="loginForm" 4 input="/index.jsp" 5 name="loginForm" 6 path="/login" 7 scope="request" 8 type="lq.wangzhen.struts.action.LoginAction" 9 cancellable="true" > 10 <forward name="success" path="/pages/success.jsp"></forward> 11 </action>
name是跳转路径名称,就是Action中findForward()方法中传入的值
path是具体跳转路径,必须以 / 开头。
在index.jsp中提示错误信息
1 <body> 2 <font color="red"><html:errors property="loginErr"/></font> 3 <html:form method="post" action="login.do" > 4 <br>用户ID:<html:text property="userid"></html:text> 5 <font color="red"><html:errors property="useridErr"/></font> <!-- 配置用户名错误信息 --> 6 <br>密码:<html:password property="password"></html:password> 7 <font color="red"><html:errors property="passwordErr"/></font> <!-- 配置密码错误信息 --> 8 <br><html:submit value="登陆"></html:submit> 9 </html:form> 10 </body>