上篇博客中已经学习了Struts这个框架是如何实现MVC,这篇博客简单的介绍一下struts的框架如何搭建、一条线怎么走通。
首先需要建立一个java的web项目,因为Struts是一个web框架。建立完毕后需要在项目中引入struts相关的jar包到WEB/lib目录下。(下图供参考)
基本的打底工作完成后就可以开始进行配置,控制一条线的流通。以逻辑最熟悉登录为实例。
第一配置:web.xml
上篇博客中我们说到ActionServlet会截取URL请求,那么浏览器中会有页面转向、也会有URL请求。那么什么样的URL会被截取这就是在web.xml中配置的。
<span style="font-size:18px;"><?xml version="1.0"encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class><!--完整的ActionServlet路径-->
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value><!--action的配置文件路径-->
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
<!--load-on-startup元素标记容器是否在启动的时候就加载这个servlet;
当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;
当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。
-->
</servlet>
<!-- Standard Action ServletMapping -->
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern><!--当URL的末尾是.do时会被ActionServlet拦截并截取,这里可任意配置标识-->
</servlet-mapping>
</web-app> </span>
第一配置完成后就可以确定要截取什么样的URL请求和要读取的action配置文件。
第二配置:struts-config.xml
有web.xml配置文件的配置可确定要读取的action配置文件,在该action配置文件中就要确定调用那个action。
<span style="font-size:18px;"><?xml version="1.0"encoding=" UTF-8" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD StrutsConfiguration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
<form-beans>
<!-- 配置的ActionForm,可以传递数据 -->
<form-bean name="loginForm" type="com.bjpowernode.struts.LoginActionForm"/>
</form-beans>
<action-mappings>
<!--
action——
path:对应截取完毕的URL
type:要调用的action的完整路径
name:对应要使用的ActionForm
scope:设置将ActionForm设置位置,默认为session
forward——
name:ActionForward根据设置的值匹配forward的那么熟悉
path:要调整的页面的路径
-->
<action path="/login"
type="com.bjpowernode.struts.LoginAction"
name="loginForm"
scope="request"
>
<forward name="success" path="/login_success.jsp"/>
<forward name="error" path="/login_error.jsp"/>
</action>
</action-mappings>
</struts-config></span>
第二个配置完成后就可以真正的实现根据请求的URL调用对应的action同时将请求的数据或返回的数据对应到ActionForm中。ActionForm是需要我们自己根据数据库的字段建立的,这个登录实例中我们会用到“用户名”和“密码”。
<span style="font-size:18px;">/**
* 登录ActionForm,负责表单收集数据
* 表单的属性必须和ActionForm中的get和set的属性一致
* @author yxf
*
*/
@SuppressWarnings("serial")
public classLoginActionForm extends ActionForm {
private String username;//用户名
private String password;//密码
public String getUsername() {
return username;
}
public void setUsername(Stringusername) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(Stringpassword) {
this.password = password;
}
}</span>
*注:jsp页面在提交或action返回数据时时根据get和set后的名字确定的。例如getUsername对应到页面上就是将get后的Username首字母变为小写即username。
ActionForm建立,两个配置完成后整体的流程就确定了,剩下的就是对action的代码编写了。
<span style="font-size:18px;">/**
* 登录Action
* 负责取得表单数据、调用业务逻辑、返回转向信息
*
* @author Administrator
*
*/
public classLoginAction extends Action {
@Override
public ActionForwardexecute(ActionMapping mapping, ActionForm form, HttpServletRequest request,HttpServletResponse response) throws Exception {
LoginActionFormlaf = (LoginActionForm)form;//拿到ActionForm
Stringusername = laf.getUsername();//获取用户名
Stringpassword = laf.getPassword();//获取密码
UserManageruserManager = newUserManager();
try {
userManager.login(username,password);//调用manager方法验证
return mapping.findForward("success");//成功跳转到配置的成功页面
}catch(UserNotFoundExceptione) {
e.printStackTrace();
request.setAttribute("msg", "用户不能找到,用户名称=【" + username + "】");
}catch(PasswordErrorExceptione) {
e.printStackTrace();
request.setAttribute("msg", "密码错误");
}
return mapping.findForward("error");//失败跳转到配置的失败页面
}
}</span>
小结:
整体的流程实现就是这样的,容易理解实现也比较简单。需要进一步了解的是struts框架是如何根据配置文件完成类的实例化。