前言:这是一个最简单的Struts 1.x的项目。设计思路是在表单中输入用户名和密码,验证用户名和密码是否有内容(服务器端验证),如果输入正确显示欢迎信息,否则显示错误信息。
使用软件:MyEclipse2017, Tomcat 8.5
MyEclipse默认支持Struts 1.x和Struts 2.x的开发。
一、建立一个新的项目
1.选择新建Web Project,输入项目名称Struts_Login
2.在Struts 1.x还没有Annotation配置支持,所以此处使用Struts 1.x建议生成web.xml
3.所谓的开发框架实际上是一组开发程序jar包,在MyEclipse里面可以直接为项目配置这些jar包
(1)选择项目——右键——选择MyEclipse的项目支持(选择Struts 1.x)
(2)进入Struts 1.x的配置页面,本次选择1.3版本
(3)定义配置信息
- Servlet的处理路径:Struts 1.x中的Servlet路径是一个经典的“*.do”
- 要求输入项目的程序包,本次设置为lh_login(这个时候会发现自动创建一个文件“application resource”,是保存文本资源的文件)
- 询问用户要使用的开发包
(4)点击finish,此时产生了一系列jar包
4.项目完成后为自动在项目中出现以下内容
- 会自动将Struts 1.x的开发包配置到CLASSPATH中
- 在WEB-INF目录下会自动创建有一个struts-config.xml文件,这个是Struts的核心配置文件
- 在src目录下(最终会输出到WEB-INF/classes下)存在一个ApplicationResources.properties
二、开发项目
1.建立一个名为login.jsp的页面
(1)创建界面
(2)在建立这个页面的时候,将使用Struts 1.x提供的标签完成(为了方便回填)
(程序代码见文章最后)
2.配置错误信息,修改ApplicationResoureces.properties文件
```html
# 这些验证的错误信息是给ActionForm准备的
username.input.null=<li>登录用户名不允许为空!</li>
password.input.null=<li>登录密码不允许为空!</li>
# 这些登录的结果信息是给Action准备的
login.success=用户登录成功,欢迎!
login.failure=用户登录失败,请重新登录!
3.创建处理程序
Struts 1.x的处理程序分为两种类型:Action(负责跳转功能,与Servlet相似)、ActionForm(进行数据验证使用的)
(1)创建文件
(2)首先会进入到创建ActionForm的操作对话框
- Use case:表示本次操作的模块名称,输入“mylogin”
- 随后自动出现一个name的数据“myloginForm”,它是在struts-config.xml文件里面出现的
- 让这个ActionForm继承“org.apache.struts.action.ActionForm”类
- 设置属性:在JSP中写了两个属性,分别为“username”和“password”
(3)下一步进入到Action的配置
- 这里面最需要配置的是一个访问路径,也就是表单提交路径“/mylogin”
- 此Action继承“org.apache.struts.action.ActionForm”父类
- 设置Input Source为login.jsp
4.在MyloginActionForm中编写如下代码
- 发现建立的属性(此处为username和password)都会自动生成setter、getter对应的方法
- 数据验证的代码操作要求写在validate操作里面
5.开发Action程序,一旦代码执行到Action之后,那么就表示数据验证已经通过了,一定是符合要求的数据。
- 在struts-config.xml文件里面配置跳转的路径,现在假设成功或者失败都跳转到login.jsp
- 编写MyLoginAction程序类(程序见文章最后)
三、遇到的问题:
1.项目汉字乱码
(1)在login.jsp文件最上方加上
<%@page contentType=“text/html; charset=UTF-8”%>
<%@ page language=“java” pageEncoding=“UTF-8”%>
(2)web.xml和struts-config.xml文件第一行都有
四、输出结果
五、程序代码
1.login.jsp文件
<%@page contentType="text/html; charset=UTF-8"%>
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html:html lang="true">
<head>
<html:base />
<title>请登录</title>
</head>
<body>
<html:errors/>
${msg}
<html:form action="mylogin.do" method="post">
用户名:<input type="text" name="username"> <br/>
密码:<input type="password" name="password"> <br/>
<input type="submit" name="submit1" value="登录">
</html:form>
</body>
</html:html>
2.web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>Struts_Login</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
3.struts-config.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
<form-beans >
<form-bean name="myloginForm" type="lh_login.struts.form.MyloginForm" />
</form-beans>
<global-exceptions />
<global-forwards />
<action-mappings >
<action
attribute="myloginForm"
input="/login.jsp"
name="myloginForm"
path="/mylogin"
scope="request"
type="lh_login.struts.action.MyloginAction"
cancellable="true" >
<forward name="success" path="/login.jsp"/>
<forward name="failure" path="/login.jsp"/>
</action>
</action-mappings>
<message-resources parameter="lh_login.struts.ApplicationResources" />
</struts-config>
4.MyloginForm.java文件
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package lh_login.struts.form;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
/**
* MyEclipse Struts
* Creation date: 10-27-2020
*
* XDoclet definition:
* @struts.form name="myloginForm"
*/
public class MyloginForm extends ActionForm {
/** password property */
private String password;
/** username property */
private String username;
/**
* Method validate
* 此方法主要进行输入数据的验证,如果现在输入的数据有错误,则将错误信息保存在ActionMessage类对象里面
* 并且所有的ActionMessage类对象可以统一保存在ActionErrors,如果在返回的时候返回的是null或者ActionEroors返回的内容没有包含任何错误信息
* 那么会将请求继续交给Action进行处理,否则会返回到一个错误路径
* @param mapping 表示所有的映射信息,此类一般不使用
* @param request 可以接收用户的请求参数
* @return ActionErrors 如果返回为null或者里面保存的错误信息为0,那么表示正确,
*/
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors errors =new ActionErrors();//保存错误信息
//当用户发送请求后,所有的输入的参数都会自动调用setter赋值,当执行到此方法时,一定是处理完参数了
if (this.username==null||"".equals(this.username)){//输入的username参数内容为空
//Add()方法有两个参数,第一个参数表示的是提交参数的名字
//第二个参数表示读取的错误的key,错误的信息利用ActionMessage读取
errors.add("username",new ActionMessage("username.input.null"));
}
if (this.password==null||"".equals(this.password)){
//Add()方法有两个参数,第一个参数表示的是提交参数的名字
//第二个参数表示读取的错误的key,错误的信息利用ActionMessage读取
errors.add("password",new ActionMessage("password.input.null"));
}
return errors;
}
public void reset(ActionMapping mapping, HttpServletRequest request) {
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
5.MyloginAction.java文件
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package lh_login.struts.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lh_login.struts.form.MyloginForm;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class MyloginAction extends Action {
/** 此操作主要是进行用户的请求处理,类似于doGet()或者是doPost()方法功能
* @param mapping 此类主要负责读取struts-config.xml文件配置
* @param form 表示要操作的ActionForm,使用它的目的是为了能够接收参数
* @param request 用户的请求
* @param response 用户回应
* @return ActionForward 表示返回的路径信息,通过配置文件取出映射的key
*/
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
MyloginForm myloginForm = (MyloginForm) form;
if("java".equals(myloginForm.getUsername())&& "java".equals(myloginForm.getPassword())){
request.setAttribute("msg", "用户登录成功,欢迎!");
return mapping.findForward("success");
}else{
request.setAttribute("msg", "用户登录失败,请重新登录!");
return mapping.findForward("failure");
}
}
}
6.ApplicationResources.properties文件
Resources for parameter 'lh_login.struts.ApplicationResources'
# Project Struts_Login
# \u8FD9\u4E9B\u9A8C\u8BC1\u7684\u9519\u8BEF\u4FE1\u606F\u662F\u7ED9ActionForm\u51C6\u5907\u7684
username.input.null=<li>\u767B\u5F55\u7528\u6237\u540D\u4E0D\u5141\u8BB8\u4E3A\u7A7A\uFF01</li>
password.input.null=<li>\u767B\u5F55\u5BC6\u7801\u4E0D\u5141\u8BB8\u4E3A\u7A7A\uFF01</li>
# \u8FD9\u4E9B\u767B\u5F55\u7684\u7ED3\u679C\u4FE1\u606F\u662F\u7ED9Action\u51C6\u5907\u7684
login.success=\u7528\u6237\u767B\u5F55\u6210\u529F\uFF0C\u6B22\u8FCE\uFF01
login.failure=\u7528\u6237\u767B\u5F55\u5931\u8D25\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\uFF01