Struts2
一、概述:
- struts2把Servlet、JSP、自定义标签、JSP标准标签库、信息资源全部整合起来了
- 并且已经实现了MVC开发模式。
- 基于Struts2开发web project比原生开发有许多好处:
- 1)开发人员如果基于Struts2进行web project的开发,就不用像原生开发那样,还得自己去实现MVC开发模式,自己去集成相应的servlet、jstl标签库的jar包到自己的project中,只需要引入Struts2的相应jar包,就可以直接使用其servlet API、标准标签库中的jsp标签了。
- 2)struts2框架中除了集成了上述servlet、标签库等等,还扩展了另外一部分功能,也从极大程度上方便web project程序的开发,加快开发进程。这些功能包括:前端拦截器、运行时表单属性验证、类型转换、OGNL表达式语言、IoC容器。
- 3)除了支持JSP之外,还支持FreeMarker、Velocity等表现层技术
- 4)Struts2中的Action和Servlet实现了松耦合,使得Action更像一个普通的java对象,该控制器代码中没有耦合任何的Servlet API,这也使单元测试变得更加方便。
二、编程思路
- step1,下载Struts2开发包
-
- 网址:http://struts.apache.org
- 有多种版本可供选择,建议下载FullDistribution版
- 解压下载所得压缩包,可以看到apps/docs/lib/src等文件夹,分别存放着使用Struts2的示例程序、相关文档、Struts2核心类库以及所依赖的三方类库、Struts2框架的所有源代码。
-
- step2,安装Struts2开发包至你的project中
-
- 解压step1下载所得压缩包
- 获取其lib文件夹下的jar包,将其复制粘贴至project的WEB-INF/lib/目录下
-
- step3,在project的web.xml中配置Struts2的核心控制器,用来拦截客户请求
-
-
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> <init-param> <param-name>struts.i18n.encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <!-- 添加下面这行的目的是使程序可以使用struts2中的内置类型转换器实现简单类型转换 --> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/struts/*</url-pattern> </filter-mapping>
-
-
- step4,经过上述步骤,Struts2已经集成到你的project中了,下面就可以基于Struts2所提供的各种功能为你的web project添加各个功能模块
- 例一,为你的web project添加用户登录模块
-
功能 login.jsp 用户登录页面,可以输入用户名和密码 LoginAction.java 用于处理用户的“登录请求”,并且根据请求参数返回相应的结果
-
-
step5,创建视图页面 login.jsp
-
-
-
<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <font color="red" style="font-size:12px"> <s:property value="#session.errorMsg_login"/><br><!-- 显示错误信息:LoginInterceptor.java返回的错误信息 --> <!-- 客户访问权限受限资源时,都会先将请求交给limittedResources.action进行处理, 该action中引入了自定义拦截器loginInterceptor,该拦截器会判断用户是否是已登录用户, 若是,则继续执行下面的拦截器或action,否则就将错误信息保存在session范围的Map集合中,key="errorMsg",并且跳转至登录页面login.jsp --> <s:property value="#session.errorMsg_null"/><br><!-- 显示错误信息:LoginAction.java返回的错误信息 --> <s:property value="#session.errorMsg_passwprd"/><br><!-- 用户名存在但是输入的密码不正确则显示此信息,该错误信息来自于LoginAction --> <s:property value="#session.errorMsg_username"/><br><!-- 用户名不存在时显示此信息,该错误信息来自于LoginAction --> </font> <s:form action="login_execute" method="post" namespace="/"> <s:textfield name="user.username" label="用户名" title="请填写用户名,注意大小写" cssStyle="160px;height:26px;"/> <s:password name="user.password" label="密码" title="请填写密码,注意大小写" cssStyle="160px;height:26px;"></s:password> <s:submit value="登陆"></s:submit> </s:form>
-
-
-
-
step6,创建业务控制器类LoginAction.java
-
-
-
/* * author:lxrm * date:2016/05 * @function execute():用户登录, * login.jsp中会触发该action,useraction.execute.action * LoginAction-validation.xml文件来验证用户输入的数据是否合法(文件名:action名称-validation.xml;存放位置:放在对应action的同级目录下) * @function register():用户注册 * * */ package lxrm.struts2demo.actions; import lxrm.struts2demo.javabeans.User; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport { private User user; @Override public String execute() throws Exception { /*将username存放成session范围的属性, * 这样就可以通过使用LoginInterceptor拦截器判断session范围内是否有username属性来 * 来得出用户是否已经登录的判断结果*/ HttpServletRequest request=ServletActionContext.getRequest(); HttpSession session=request.getSession(); if(user.getUsername()!=null&&!user.getUsername().equals("")){ session.setAttribute("username", user.getUsername()); }else{ session.setAttribute("errorMsg_null", "用户名不能为空"); } if(user.getUsername().equals("lxrm")){ if(user.getPassword().equals("1")){ return SUCCESS; }else{ session.setAttribute("errorMsg_password", "密码不正确,注意大小写"); return INPUT; } }else{ session.setAttribute("errorMsg_username", "不存在的用户名"); return INPUT; } } /* * 和execute相似的逻辑处理函数,返回注册页面作为视图页面*/ public String register(){ return "regist"; } public void setUser(User user){ this.user=user; } public User getUser(){ return this.user; } }
-
-
-
-
step7,在src目录下新建struts.xml,并且在struts.xml中配置LoginAction
-
-
-
<action name="login_*" class="lxrm.struts2demo.actions.LoginAction" method="{1}"> <result name="success">/jsp/welcome.jsp</result> <result name="input">/jsp/login.jsp</result> <result name="regist">/jsp/register.jsp</result> </action>
-
-
-
-
step8,创建welcom.jsp register.jsp页面
- step9,浏览器访问login.jsp