问题:
为什么有structs
作为一种框架(frameset)可以与传统的mvc进行比较?
MVC是一种模式数据处理、显示和数据输入分开,来规范开发,但是却又并不规范。可以这样想:有三家公司,他们对于MVC有自己的理解和编写方式所以编写的方式却又并不相同,这样structs应运而生。
Structs是一种基于MVC的规范来进行开发。这样再编程的过程中可以发现:
1.程序规范化了
2.程序编写效率高
3.程序同时可维护性提高且可读性增强。
但我们可以根据任何事物不能完全的原则,所以这样的方法也有缺陷,这里就不细说了。
简单的提以下几点供读者考虑:
下面是struts的关键点:
struts如果仅仅只是会用工具然后点击生成,那样只能叫“点”过,不能叫学过。
任何程序开发需要明白流程,只有真正的原理才能在使用工具时明白底层的调用关系,在后续的遇到一些需要“真功夫”时才能拿得出手。
整个用structs进行测试的开发步骤(注:整个程序考虑是struts1.3.10 struts2在此基础上改进):
1.建立工程
2.引入jar包
3.建立登录login.jsp提交相应的数据表单
4.编写actionform和action(关于login)
5.编写struct-config.xml 用于配置actionform对应关系和跳转的位置
6.编写跳转成功页面wel.jsp和失败页面error.jsp
7.配置web.xml进行配置关键的actionservlet
8.进行测试
核心代码:
1.跳转到主界面:index.jsp (这样具有更好的保密性)
2.登录界面login.jsp
3.增加表单actionform
1 package com.ly.forms; 2 3 //用户表单,用于填充数据 4 import org.apache.struts.action.ActionForm; 5 6 public class UserForm extends ActionForm { 7 8 //属性定义(规范与jsp中的控件名一样) 9 private String username; 10 private String passwd; 11 12 public String getUsername() { 13 return username; 14 } 15 public void setUsername(String username) { 16 this.username = username; 17 } 18 public String getPasswd() { 19 return passwd; 20 } 21 public void setPasswd(String passwd) { 22 this.passwd = passwd; 23 } 24 25 }
4.表单对应的action
package com.ly.actions; //这是一个action 需要继承action 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 com.ly.forms.UserForm;public class LoginAction extends Action {//execute可被自动调用 类似servlet dopost()方法public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception {// TODO Auto-generated method stub//把form强转成对应的userform类UserForm userform=(UserForm)form;System.out.println("用户名="+userform.getUsername()+"密码="+userform.getPasswd());//return super.execute(mapping, form, request, response);//简单验证if(userform.getPasswd().equals("123")){//把用户名放到request 对象域中request.setAttribute("username", userform.getUsername());//密码123是合法用户mapping 是直接返回actionServletreturn mapping.findForward("ok");}else{return mapping.findForward("err");}}//需要重写一个方法 }
5.添加struts配置文件
<?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> <!-- name 表单名字随意 (小写) --> <!-- type是表单的全路径 --> <!-- 配置struts 中action 与actionForm的关系 --> <form-bean name="userForm" type="com.ly.forms.UserForm"/> </form-beans><action-mappings> <!-- 配置具体 action 其path:表示将来访问url --> <!--name: action与对应 actionForm的对应--> <!-- path:action全路径 --> <action path="/login" name="userForm" type="com.ly.actions.LoginAction"> <!-- 这里配置跳转关系 --><!-- name是结果名称 path是转发页面 --> <forward name="ok" path="/WEB-INF/wel.jsp"/> <forward name="err" path="/WEB-INF/error.jsp"/> </action> </action-mappings> </struts-config>
6.(省略wel.jsp 和error.jsp 只需简单写写就行必要时再添加)
进行web配置 web.xml
<?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"><!-- 配置structs --><!-- 用actionServlet控制 --><servlet><servlet-name>action</servlet-name><servlet-class>org.apache.struts.action.ActionServlet</servlet-class><!-- 指明 配置文件 strcts-config路径 --><init-param><param-name>config</param-name><param-value>/WEB-INF/struts-config.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>action</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list> </web-app>
struts配置细节
一个简单的登陆测试
下面是流程的截图(仅供参考):
actionServlet进行了实例化对象(反射机制),这样才能对表单进行添加数据(actionform)
注意 表单中的set和get方法
通过actionservlet来明细整个流程会对整个流程更加清晰
考虑:在此基础上增加在成功界面显示登录者的用户名
但是会出现中文乱码问题(在wel.jsp中添加语句并不会有太多的用 考虑:整个流程在actionservlet中已然已经把数据添加到表单了)
(考虑使用过滤器)--记得在web.xml配置过滤器
主要代码:
package com.ly.filters;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MyFilter1 extends HttpServlet implements Filter {public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {// TODO Auto-generated method stub//过滤方法arg0.setCharacterEncoding("utf-8"); //设置接收编码arg2.doFilter(arg0, arg1); //必须(否则停止前进)arg1.setContentType("/text/html;charset=utf-8");}public void init(FilterConfig arg0) throws ServletException {// TODO Auto-generated method stub}}
在web.xml中添加
效果:
以上仅是一个小的demo 仅供学习。
日进一小步,月过一大步~~加油!!