Java学习大全 之 Struts1

 

1、struts1是轻量级框架,设计思想是MVC。SSH混用框架中struts1担任视图层。action为单实例的,线程需要同步。
2、MVC是指模型视图控制器。
3、struts1流程:browser -request-> ActionServlet(根据struts-config.xml配置文件找到action与model层交互) -forward-> jsp -response-> browser
4、ActionServlet类:用来控制导航action的。根据url来决定哪个action被处理。
5、struts1配置文件struts-config.xml需要在WEB-INF目录下的。
<?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>
  <data-source type="org.apache.commons.dbcp.BasicDataSource">
      <set-property property="driverClassName" value="org.postgresql.Driver" />
      <set-property property="url" value="jdbc:postgresql://localhost/mydatabase" />
      <set-property property="username" value="me" />
      <set-property property="password" value="test" />
      <set-property property="maxActive" value="10" />
      <set-property property="maxWait" value="5000" />
      <set-property property="defaultAutoCommit" value="false" />
      <set-property property="defaultReadOnly" value="false" />
      <set-property property="validationQuery" value="SELECT COUNT(*) FROM market" />
  </data-source>
 </data-sources>
 <form-beans>
  <!--表示表单映射,子元素为form-bean-->
 </form-beans>
 <!--不需要时候可以不写-->
 <global-exceptions>
  <!--全局异常,子元素为exception-->  
 </global-exceptions>
 <!--不需要时候可以不写-->
 <global-forwards>
  <!--全局异常处理去向,子元素为forward-->
 </global-forwards>
 <action-mappings>
  <!--表示请求映射,子元素为action-->
 </action-mappings>
 <message-resources parameter="com.ApplicationResources" />
</struts-config>

6、使用流程
 一、web.xml的配置
 <servlet>
  <servlet-name>action</servlet-name>
     <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
     <!--初始化参数,可以不写,如果不写则加载默认名字的xml文件-->
     <init-param>
   <param-name>config</param-name>
   <param-value>/WEB-INF/struts-config.xml</param-value>
     </init-param>
     <!--启动服务就实例化ActionServlet,可以不用写-->
  <load-on-startup>2</load-on-startup>
 </servlet>
 <servlet-mapping>
  <servlet-name>action</servlet-name>
  <url-pattern>*.do</url-pattern>
 </servlet-mapping>
 二、写一个action类继承Action抽象类
 三、写一个actionForm类继承ActionForm抽象类
 四、在struts-config.xml配置文件添加bean和action
7、不使用数据源的例子
 登录页面index.jsp
 <body>
  <form action="login.do" method="post">
     用户名:<input name="username" type="text" /><br/>
     密码:<input name="password" type="password"/><br/>
     登录:<input type="submit" value="提交"/>
  </form>
 </body>
 成功页面success.jsp
 <body>
  success跳转<br/>
  用户名:${param.username}<br/>
    密码:${param.password}<br/>
 </body>
 LoginForm.java类
 public class LoginForm extends ActionForm {
  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;
  }
 }
 LoginAction.java类
 public class LoginAction extends Action {
  @Override
  public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) throws Exception {
   LoginForm lf = (LoginForm) form;
   System.out.println(lf.getUsername());//后台打印用户输入的用户名
   System.out.println(lf.getPassword());//后台打印用户输入的密码
   return mapping.findForward("success");//表示去映射里找到本action的名字为success的forward获得去向,然后跳转。
  }
 }
 struts-config.xml配置
 <struts-config>
  <form-beans>
   <!--form-name元素的属性name的值要和action元素的属性name的值一样,表示该action用到这个表单-->
   <form-bean name="login" type="com.LoginForm"></form-bean>
  </form-beans>
  <action-mappings>
   <action path="/login" name="login" type="com.LoginAction">
   <forward name="success" path="/success.jsp"/><!--根据forward的name属性跳转到哪里-->
  </action> 
  </action-mappings>
 </struts-config> 

8、使用数据源和连接池例子
 在上例子基础上,在struts-config.xml加上数据源配置
 <data-sources>
  <!--data-source元素的key属性值使用来被action实例getDataSource(HttpServletRequest request String key)所用-->
  <data-source key="mysql" type="org.apache.commons.dbcp.BasicDataSource">
      <set-property property="driverClassName" value="org.gjt.mm.mysql.Driver" />
      <set-property property="url" value="jdbc:mysql://localhost:3306/mytest" />
      <set-property property="username" value="root" />
      <set-property property="password" value="root" />
      <set-property property="maxActive" value="10" />
      <set-property property="maxWait" value="20" />
      <set-property property="defaultAutoCommit" value="false" />
      <set-property property="defaultReadOnly" value="false" />
  </data-source>
 </data-sources>
 LoginAction.java类
 public class LoginAction extends Action {
  @Override
  public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response)
    throws Exception {
   LoginForm lf = (LoginForm) form;
   System.out.println(lf.getUsername());
   System.out.println(lf.getPassword());
   DataSource  ds = this.getDataSource(request,"mysql");//通过key获得哪个数据源
   Connection conn = ds.getConnection();//获得连接
   ResultSet rs =conn.prepareStatement("select * from ttt").executeQuery();//查询ttt表
   while(rs.next()){
    System.out.println(rs.getString(2));//打印表的记录
   }
   return mapping.findForward("success");
  }
 } 
9、struts标签库
 在jsp页面声明标签如下:
 <%@ taglib prefix="bean"  uri="http://struts.apache.org/tags-bean" %>
 <%@ taglib prefix="logic"  uri="http://struts.apache.org/tags-logic" %>
 <%@ taglib prefix="html"  uri="http://struts.apache.org/tags-html" %>

10、通过ActionForm类校验
 步骤
 一、在ActionForm类里面重写validate方法
 
 @Override//重写这个方法主要是为了每次访问本action都清空username和password属性值
 public void reset(ActionMapping mapping, HttpServletRequest request) {
  this.username = "";
  this.password = "";
 }
 @Override
 public ActionErrors validate(ActionMapping mapping,HttpServletRequest request) {
  ActionErrors errors = new ActionErrors();//用来存放多个错误的变量(映射的方式)
  if(username == null || username.equals("")){
   //ActionErrors的add方法第一个参数表示区别不同的错误,被jsp页面<bean:error property=""/>所用
   //第二个参数是ActionMessage类第一个参数是配置文件里面的com.ApplicationResources.properties文件的key,第二个参数是准备要连接到错误信息的前面。
   errors.add("usernameEmpty", new ActionMessage("input.empty","username"));
  }
  if(password == null || password.equals("")){
   errors.add("passwordEmpty", new ActionMessage("input.empty","password"));
  }
  return errors;
 }
 二、在struts-config.xml配置文件添加元素
 <message-resources parameter="com.ApplicationResources" />
 <!--validate默认为false,true表示允许校验,false不允许校验,input属性值表示校验信息在那个页面显示-->
 <action-mappings>
 <action path="/login" name="login" type="com.LoginAction" validate="true" input="/index.jsp">
    <forward name="success" path="/success.jsp"></forward>
 </action> 
 </action-mappings>
 三、按照第二步的所设置的信息源路径创建文件(用来存放键值对)
 本例子创建为:在com包下的ApplicationResources.properties
 ApplicationResources.properties内容:
 #下一行的"{0}"表示ActionMessage构造方法第二个参数,"{1}"表示第二个······
 input.empty={0} must is not null
 四、在jsp页面上写上能显示错误信息的标签
   <form action="login.do" method="post">&nbsp;
    <!--html:errors标签的property属性值是ActionErrors对象里面的某个key-->
    用户名:<input name="username" type="text" /><html:errors property="usernameEmpty"/><br/>
    密码:<input name="password" type="password"/><html:errors property="passwordEmpty"/><br/>
    登录:<input type="submit" value="提交"/>
   </form>
11、通过Action类校验
 例子在上面例子的LoginAction:
 public class LoginAction extends Action {
  @Override
  public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)
    throws Exception {
   LoginForm lf = (LoginForm) form;
   if(lf.getUsername().equals("")){
    ActionErrors errors = new ActionErrors();
    errors.add("usernameEmpty",new ActionMessage("input.empty","username"));
    saveErrors(request, errors);//保存ActionErrors对象到request
    return mapping.getInputForward();//表示回到用户输入界面
   }
   return mapping.findForward("success");
  }
 }

12、国际化
 一、按照<message-resources parameter="com.ApplicationResources" />参数的名字,在同一个包里新建一个国际化资源文件。
 例子:新建一个中文资源文件ApplicationResources_zh_CN.properties
 username=用户名
 password=密码
 login=登录
 新建一个英文资源文件ApplicationResources_en.properties//注意:如果用action去处理语言的话就ApplicationResources_en.properties,否则为ApplicationResources_en_US.properties就是差个"US"而已,为什么呢?无解。
 username=username
 password=password
 login=login
 二、在jsp页面用struts标签显示国际化内容
   <form action="login.do" method="post"> 
    <bean:message key="username"/><input name="username" type="text" /><br/>
    <bean:message key="password"/><input name="password" type="password"/><br/>
    <bean:message key="login"/><input type="submit" value="提交"/>
   </form>
   <form action="i.do" method="post">
    <input type="submit" value="切换成英文"/>
   </form>
   配置
   <action path="/i" type="com.I" input="/index.jsp"></action>
   三、在action类切换语言
 public class I extends Action {
  @Override
  public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)
    throws Exception {
   //设置session的语言,这个Globals.LOCALE_KEY字符常量等于org.apache.struts.action.LOCALE
   request.getSession().setAttribute(Globals.LOCALE_KEY, Locale.ENGLISH);
   //request.getSession().setAttribute("org.apache.struts.action.LOCALE", Locale.ENGLISH);
   return mapping.getInputForward();
  }
 }
 相关:
  Locale defaultLocale = Locale.getDefault();//获得默认的国家语言
  Locale locale = new Locale("en","US");//构造一个新的国家语言(美国英语)
  locale locale = new Locale("zh","CN");//构造一个新的国家语言(中国中文)
 
13、异常处理例子
 一、index.jsp页面
 <body>
  <form action="exception.do" method="post">
   <input type="submit" value="tijiao"/>
  </form>
 </body>
 二、exception.jsp页面
 <body>
     页面出错了<br/>
     ${e}<!--打印异常-->
 </body>
 三、ExceptionAction.java
 public class ExceptionAction extends Action {
  @Override
  public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response)
    throws Exception {
   try {
    System.out.println(1/0);//会出异常
   } catch (Exception e) {
    request.getSession().setAttribute("e", e);//在session增加属性e保存异常信息
    throw(e);//再次抛出让struts去处理
   }
   return mapping.findForward("success");
  }
 }
 四、struts-config.xml配置
 <struts-config>
  <action-mappings >
   <action path="/exception" type="com.ExceptionAction">
    <!--exception的key表示在资源文件ApplicationResources.properties的key,可以用<bean:message property="key"/>在页面输出-->
    <!--type="表示要抓那一种类型异常"-->
    <!--path表示抓到这个异常后调到那里去-->
    <!--注意exception元素要放在forward的前面-->
      <exception key="exception" type="java.lang.Exception" path="/exception.jsp" /> 
      <forward name="success" path="/index.jsp"/>
   </action>
  </action-mappings>
  <message-resources parameter="com.ApplicationResources" />
 </struts-config>

14、插件:用来在servlet容器启动和关闭时候做一些事情的
 步骤
 一、配置
 <struts-config>
  <action-mappings >
   <action path="/exception" type="com.ExceptionAction">
    <!--exception的key表示在资源文件ApplicationResources.properties的key,可以用<bean:message property="key"/>在页面输出-->
    <!--type="表示要抓那一种类型异常"-->
    <!--path表示抓到这个异常后调到那里去-->
      <exception key="exception" type="java.lang.Exception" path="/exception.jsp" /> 
      <forward name="success" path="/index.jsp"/>
   </action>
  </action-mappings>
  <message-resources parameter="com.ApplicationResources" />
 </struts-config>
 二、实现PlugIn接口
 public class MyPlug implements PlugIn {
  public void destroy() {
   System.out.println("插件销毁");
  }
  public void init(ActionServlet arg0, ModuleConfig arg1)
    throws ServletException {
   //做一些初始化
   System.out.println("插件启动");
  }
 }
 
15、 类型转换
 步骤:
 一、实现Converter接口
 三、编写插件优先启动来注册类型转器或者编写servlet进行注册类型转器,并配置web优先加载servlet<load-on-startup>3</load-on-startup>
 例子:
 ConverterUtilDate.java类型转器
 public class ConverterUtilDate implements Converter {
  public Object convert(Class type, Object value) {
   //value是表单传来的值
   System.out.println("该被访问了,value的值:" + value.toString());
   //这里可以将用户输入的有一定格式的字符转成Date对象
   return new Date();//这里直接返回一个新的日期对象
  }
 }
 Registconverter.java插件
 public class RegistConverter implements PlugIn {
  public void destroy() {
  }
  public void init(ActionServlet servlet, ModuleConfig config)throws ServletException {
   //这里用ConvertUtils的register方法把ConverterUtilDate转换器注册转成java.util.Date类型的set到ActionForm对象里面
   ConvertUtils.register(new ConverterUtilDate(), java.util.Date.class);
   System.out.println("注册完毕");
  }
 }
 struts-config.xml配置
 <plug-in className="com.RegistConverter"></plug-in>
 DateActionForm.java类
 public class DateActionForm extends ActionForm {
  private Date date;//java.util.Date类型的属性
  public Date getDate() {
   return date;
  }
  public void setDate(Date date) {
   this.date = date;
  }
 }
 DateAction.java类
 public class DateAction extends Action {
  @Override
  public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response)
    throws Exception {
   DateActionForm df = (DateActionForm) form;
   System.out.println(df.getDate());//打印
   return mapping.findForward("success");
  }
 }

16、拦截action避免写多个action
 步骤
 一、继承DispatchAction
 public class TestDispatchAction extends DispatchAction {
  public ActionForward add(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)
    throws Exception {
   System.out.println("add方法");
   return mapping.findForward("success");
  }
  public ActionForward delete(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)
  throws Exception {
   System.out.println("delete方法");
   return mapping.findForward("success");
  }
 }
 二、配置struts-config.xml的action
 <!--parameter的值是请求传过来的参数,根据参数去TestDispatchAction类里面去找对应的方法执行-->
   <action path="/testDispatch" parameter="method" type="TestDispatchAction">
    <forward name="success" path="/index.jsp"/>
   </action>
   三、在form表单的action属性中写名method参数的值,值代表要执行那个方法
   <!--这个action将要执行add方法-->
 <form action="testDispatch.do?method=add" method="post">
  <input type="submit" value="提交"/>
 </form>
 <!--这个action将要执行delete方法-->
 <form action="testDispatch.do?method=delete" method="post">
  <input type="submit" value="提交"/>
 </form>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值