在阿帕奇官网下载合适的struts1框架文件。
应用在显示层框架。
struts1与struts2虽然是一脉相承,但它们用法完全不一样。
struts2是在struts1与webwork基础上,发展的全新框架。
注:本文是在MyEclipse下进行的操作,不是之前的Eclipse。
一、文件结构
app:示例程序,其中的war包放至tomcat可直接运行 。
docs:文档,里面有关于struts的各个组件的说明。
lib:Jar包,几乎很全,不需要自己在单独下载Jar包。
src:存放着源代码。
二、处理流程的改变
没有struts时,一般网页直接将请求发送给响应处理的Servlet页面,有页面进行处理。所有的JavaBean由我们自己在对应的位置创建。
struts框架下,将ActionServlet作为核心,它负责获取、分发URL,由Action调用模型,由Form接收数据并创建JavaBean的实例。
没有struts时的大致流程为:访问链接->寻找web.xml中mapping(或者@WebServlet("/"))是否匹配->通过配置初始化相应的Servlet后调用模型->返回。
struts的大致流程即为:访问链接->web.xml中mapping是否与ActionServlet匹配,匹配的话->ActionServlet->通过struts-config.xml调用action并将其初始化->action调用模型后返回ActionServlet。
三、配置struts文件
导入lib
如果没有spring框架,在自己编写时,建议不要将lib中所有的东西导入项目,以避免报错。可以从示例程序中复制相关jar包。
需要的jar包导入项目中WEB-INF的lib即可。记得通过BuildPath导入资源。
配置web.xml文件
类似servlet配置。别忘了设置编码格式。
可以直接复制其示例程序下的配置内容。通过<servlet-mapping>,使得与<url-pattern>匹配的URL,映射为<servlet>中拥有相同<servlet-name>的<servlet-class>路径。
<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>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
即凡是通过*do访问的,都会通过action这个名称,被修改为访问org.apache.struts.action.ActionServlet这个地址。
<init-param>为该servlet的初始化设置。
<param-name>为变量名。
<param-value>为变量值,此处是用struts-config.xml进行初始化
<load-on-startup>为服务器启动时,该servlet的初始化顺序。(不设置时,就只有访问时会被初始化)
拷贝struts-config.xml
将示例程序中直接struts-config.xml拷过去。别忘了设置编码格式。
可以这样打开
将多余的配置删除
四、用struts完成登录
准备三个页面,一个用于输入用户名密码,另外两个作为登录成功或失败的结果页面。
准备一个JavaBean用于封装登录用的数据,他需要继承ActionForm。(如果没有找到,则需要通过右键选择BuildPath构建路径)
准备一个Servlet,为了省事,目前将业务逻辑也写在里面。
登录主页:index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="JavaBean.Note" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="Login.do" method="post">
用户:<input type="text" name = "uname"></br>
密码:<input type ="password" name = "pwd"><br/>
<input type = "submit" value = "登录">
</form>
</body>
</html>
JavaBean部分:User.java
继承ActionForm后,就可以自动赋值。但需要name名和setName的名称一致(格式也是),其它和之前没差别。
package JavaBean;
import org.apache.struts.action.ActionForm;
public class User extends ActionForm {
private static final long serialVersionUID = 1L;//Action序列号
private int uid;
private String uname;
private String uimage;
private String pwd;
public int getUid() {
return this.uid;
}
public String getUname() {
return this.uname;
}
public String getUimage() {
return this.uimage;
}
public String getPwd() {
return this.pwd;
}
public void setUid(int UID) {
this.uid = UID;
}
public void setUname(String UNAME) {
this.uname = UNAME;
}
public void setUimage(String UIMAGE) {
this.uimage = UIMAGE;
}
public void setPwd(String PWD) {
this.pwd = PWD;
}
}
Servlet部分:User Login
此处制作了控制层,因而并未连接数据库,而是直接对比。若需要连接,可查看之前代码。
package Service;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import JavaBean.User;
public class UserLogin extends Action {
@Override
public ActionForward execute(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse reponse) throws Exception {
User user = (User)form;//form中数据就是自动创建的User
if(user.getPwd().equals("123") && user.getUname().equals("123")){
//request.getRequestDispatcher("success").forward(request, reponse);
return mapping.findForward("success");
}
else {
//request.getRequestDispatcher("fail").forward(request, reponse);
return mapping.findForward("error");
}
}
}
struts-config设置
- 首先检测到以".do"(web.xml中设置的)结尾的URL,然后会在<action-mapping>中的<action>寻找找相同的字段(".do"之前字段)。
- 随后通过name寻找相同的<form-bean>中name,然后通过type的路径,找到JavaBean对象。然后将值自动输入,得到的类以ActionForm form形式返回。
- 然后继续<action-mapping>,通过type找到Servlet。将设置<action>中设置以ActionMapping mapping输入,将创建的JavaBean以ActionForm form输入。其余两个参数同原来的Servlet一致。
- scope用于限定创建的ActionForm的范围,于JavaWeb一致。
- 在Servlet中,通过findForward找到name所对应的path,返回,就可以通过请求转发的方式抵达下一个网站。
<?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="User" type="JavaBean.User"/>
</form-beans>
<action-mappings>
<action path="/Login"
name = "User"
type="Service.UserLogin"
scope = "request">
<forward name="success" path="/success.jsp"/>
<forward name="error" path="/fail.jsp"/>
</action>
</action-mappings>
</struts-config>
修改之后,记得重启服务器。