struts1的一些基本用法和操作
入职两周了,项目是用struts1+ibatis框架搭建的,数据库是oracle,其他还行,关键是struts1之前没用用过,所以只好在网上狂查文档,最后大致整理了一些struts1的基本使用方法。
首先struts1需要引入的jar包:
因为我的IED是Myeclipse8.5直接引入的,实在是不想在struts的网站找jar了
struts1和2的第一个区别就是xml配置的位置不一样,struts1的配置文件是放在webRoot/WRB-INF/ib下,叫做struts-config.xml
基本格式是:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <struts-config> <data-sources /> <form-beans /> <global-exceptions /> <global-forwards /> <action-mappings /> <message-resources parameter="com.yourcompany.struts.ApplicationResources" /> </struts-config>
<form-beans />:配置bean的
<action-mappings />:配置action,和2中的<action>差不多
web.xml中的配置:
<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>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
总的来说struts1就是一个大的servlet,在接收到request这个大的servlet就分配给对应的servlet,这个总的servlet隐藏在幕后,一般不用动,因为这里只是介绍怎么最基本的使用struts1,因为毕竟还是有一些公司的残余项目再用。如代码所示,这个servlet拦截所有的*.do的请求。
页面有3个,一个index.jsp,success.jsp,failuer.jsp,index.jsp有一个表单,后台做验证,如果用户名是jackie,密码是111111就跳转到success.jsp,不是的话就跳转到failuer.jsp.index.jsp的表单如下所示
<form action="check.do" method="post"> username:<input type="text" name="username"> <br/>password:<input type="password" name="password"> <br/> <input type="submit" value="submit"> </form>
其实有<html:text>的标签,但是我不喜欢用,因为标签实在是记不过来,而且我一直在想,如果不用jsp改用html怎么办,所以我个人比较喜欢最原生的标签
success.jsp:
<body> check success!!! <br> </body>
如果用户名为jackie,密码为111111就跳转到这个页面
failuer.jsp:
<body> check failuer!!! <br> </body>
验证错误就跳转到failuer.jsp页面
好了,前台的页面写好了,就是后台了
首先,既然是框架,无论是否是古老的struts1,那么我最关心的就是他可不可以帮我封装一个bean,
我们先自己写一个user对象,这样struts1就可以帮助我们封装
package com.xiaoxia.form; import org.apache.struts.action.ActionForm; public class User extends ActionForm{ /** * */ private static final long serialVersionUID = 1L; private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
struts1中的bean与2不同,必须继承一个叫ActionForm的类,其他的和2一样,属性私有,提供get和set的方法。
其次,我们来写一个处理方法的类
Mycheck.java
package com.yourcompany.struts; 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 org.apache.struts.actions.DispatchAction; import org.apache.struts.actions.ForwardAction; import com.xiaoxia.form.User; public class Mycheck extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { //先把form转换成User的实体bean User user = (User) form; //做逻辑判断,如果输入合法,那么寻找一个success的forward if(user.getUsername().equals("jackie") && user.getPassword().equals("111111")){ return mapping.findForward("success"); } //输入非法,寻寻找一个failuer的forward return mapping.findForward("failuer"); } }
其中继承了struts1中一个叫Action的类,做处理的方法名字必须是execute,四个参数中,一个是mapping,主要是处理完后跳转用的,ActionForm是struts1中帮助我们封装的实体bean,剩下的request和response和servlet中的一样。
java代码写完了,最后得配置struts的配置xml,如图所示
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <struts-config> <data-sources /> <form-beans> <form-bean name="user" type="com.xiaoxia.form.User"></form-bean> </form-beans> <global-exceptions /> <global-forwards /> <action-mappings > <action name="user" path="/check" type="com.yourcompany.struts.Mycheck" scope="request" validate="false"> <forward name="success" path="/success.jsp" /> <forward name="failuer" path="/failuer.jsp" /> </action> </action-mappings> <message-resources parameter="com.yourcompany.struts.ApplicationResources" /> </struts-config>
其中在<form-beans>中配置相对应的实体bean,name是配置文件中实体bean的名字,type是对应的java类
<action-mappings>中配置对应的action,可以配置多个action,一个action对应一个action的标签,这里只配置一个,<action>中,name对应的是要使用的实体bean
path是对应的路径,在index.jsp中的form表单中的action就是“check.do”
type是对应的做处理的类
scope是使用的范围,validate是验证,通过验证才会调用相应的方法,但是现在前台验证一般都是js,所以这个属性估计没太大用
下面的子标签<forward>就是跳转的页面,那么是对应的名字,在java代码中就是mapping.findForward(".....")中间就是<forward>中对应的名字
其他的就不一一介绍了。这样一个demo的项目就可以开始跑了
关键是比较蛋疼的问题还有一个,就是如果我想规定它跳转到某个具体方法该怎么办(处女座的强迫症模式开启……)
其实也很简单,但是网上例子真心没找到,这里总结下,首先,你的Mycheck.java必须集成另一个类叫DispathAction,然后你就可以改名字了
package com.yourcompany.struts; 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 org.apache.struts.actions.DispatchAction; import org.apache.struts.actions.ForwardAction; import com.xiaoxia.form.User; public class Mycheck extends DispatchAction { public ActionForward mycheck(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { //先把form转换成User的实体bean User user = (User) form; //做逻辑判断,如果输入合法,那么寻找一个success的forward if(user.getUsername().equals("jackie") && user.getPassword().equals("111111")){ return mapping.findForward("success"); } //输入非法,寻寻找一个failuer的forward return mapping.findForward("failuer"); } }
其次,你必须在struts-config.xml的action中加一个属性:parameter
<action name="user" path="/check" type="com.yourcompany.struts.Mycheck" parameter="operate" scope="request" validate="false"> <forward name="success" path="/success.jsp" /> <forward name="failuer" path="/failuer.jsp" /> </action>
parameter中随意指定,但是必须在提交过来的参数中有一个参数名为operate,相应的值对应方法名
2015-05-10 17:44:42