用了三天时间,把struts 1.3学习了一遍,为的是能加快我以后开发J2EE项目的速度。之前开发J2EE项目,我采用的都是MVC开发模式,页面显示用JSP,控制器用Servlet,业务层用普通java类来实现。这样的模式我用了大概两年,也开发了几个系统。在对这个模式熟悉了以后,并且熟悉了servlet的关键类和主要的方法,我决定学习一些web开发的框架,为以后的开发加速。
三天的学习只是把struts学了个大概,期间写了几个小的例子。现在将学习中遇到的问题总结如下:
1. struts的几个基本概念
①struts是一个基于MVC模式的web框架
②struts的好处:程序更加规范化,开发效率提高了,程序的可读性增加,可维护性增加
③struts不足:form表单;action是单态的(对网站并发性的处理有影响,struts 2中解决了该问题)
④框架提高了程序规范的同时,也约束了程序员的自由
2. struts的运行原理:
以一个用户登录来解释struts的运行原理
ActionServlet(总控制器/总司令):控制着struts-config.xml(该文件配置了ActionForm表单,还配置了Action小队长,以及它们之间的对应关系),这是struts的一个核心文件。由struts框架提供,我们自己不需要写,只需要配置。
ActionForm(表单/军火库):用于存放数据
Action(分控/小队长):小队长可以有多个,其本质是一个servlet。一个Action可以没有ActionForm,如果有,只能有一个,不能有两个或多个。
ActionForm和Action是有对应关系的
model(java类):service 士兵
向服务器发出http请求:
①解析主机
②解析web应用
③解析资源名
④将请求转发给ActionServlet。如果不用struts,请求将会直接转发给servlet。这是因为在web.xml文件中配置了ActionServlet
⑤当ActionServlet拿到请求,就去查询struts-config.xml文件,去填充数据,把用户传递的数据填充到表单中
⑥ActionServlet调用指定的Action,同时把表单实例传入execute方法中
⑦Action从表单中去读取数据
⑧Action调用某个model完成任务
⑨model将执行结果返回给ActionServlet
⑩ActionServlet根据返回的结果,去查struts-config.xml文件,决定跳转到哪个jsp页面
3. struts快速入门案例(用户登录系统来演示)
第一个struts项目,我们先使用手动配置开发的方式,步骤如下:
①先创建一个web工程
②将struts开发包导入到web工程
③编写login.jsp
④编写ActionForm和Action,ActionForm和Action是有对应关系的
a. 表单类必须继承ActionForm才是一个表单
b. 在ActionForm中,属性的名字最好和jsp页面的控件名字name一样。实际上不一样也是可以的,但是set/get方法的名与控件名存在关联即可。例如控件名是username,那么set方法一定要是setUsername(注意大写),而属性名可以是name,但是为方便起见,属性名一般也写成username
c. 写Action的时候,需要继承Action类,注意重写execute方法,execute会被自动调用,有点类似servlet的doGet/doPost方法
⑤配置struts-config.xml文件,该文件用于配置ActionForm和Action的对应关系、跳转位置。一般来说,struts-config.xml文件放在/WEB-INF目录下
⑥写welcome.jsp和error.jsp页面
⑦在web.xml 中配置ActionServlet
⑧开始我们第一个struts项目
注意:在配置的工程中,配置文件中path属性,都要以"/"开头
4. 使用filter配置struts,完成中文乱码过滤的问题
新建一个servlet,并且实现Filter接口,核心代码如下:
public class EncodingFilter extends HttpServlet implements Filter {
String encoding = "";
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
// TODO Auto-generated method stub
request.setCharacterEncoding(encoding);
filterChain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
encoding = filterConfig.getInitParameter("encoding");
}
}
在web.xml文件中配置如下:
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.hh.filter.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
这两句话是用来配置编码格式的,encoding参数的值,可以再filter中通过init方法得到。
如果在一个项目中有多个filter,那么,在web.xml中配置是有顺序的,先起拦截作用的filter是要先配置的
注意:
①struts-config.xml文件中,action中scope属性,默认是session
②每个Action都是单态的,包括ActionServlet也是单态的。所谓单态,是指在整个程序运行的过程中,始终是一个对象
③struts-config.xml文件不一定非要放在/WEN-INF目录下。新的路径,只要在web.xml中修改即可:
<param-value>/WEB-INF/struts-config.xml</param-value>
④在一个项目中,可以有多个struts-config.xml文件,只需要在web.xml文件中配置:
<param-value>/WEB-INF/struts-config.xml,/WEB-INF/struts-config2.xml</param-value>