思路:
1.引入struts的jar包到当前工程的的/WEB-INF/lib目录下
2.在web.xml文件中注册org.apache.struts.action.ActionServlet.并且设置初始化参数以便于系统自动获取strut-config.xml文件.
3.定义视图(jsp),定义javaBean
4.定义formBean(即实现actionForm的类)
5.创建控制器组件(关键:即实现action类的)后面还会引入同一控制器实现增删改查的控制(用DispatchAction)
关键问题:理解struts是如何将表单的数据封装到指定的actionform中的,并且数据传输的方式是什么.
创建一个Struts工程的步骤:
* 创建web工程
* 下载struts的jar包 拷贝到当前工程的的/WEB-INF/lib目录下
* 定义视图 login.jsp
* 定义javaBean接受表单数据
* 创建控制器组件 class LoginAction extends Action
* 准备配置文件
* web.xml
<servlet>
<servlet-name>action</servlet-name>
<!-- struts的中央控制器,在目前的struts版本中,只能配置一个ActionServlet,多线程运行 -->
<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>
<!--
数值越小,启动越靠前
服务器启动时实例化ActionServlet 同时调用ActionServet的init方法初始化-->
<load-on-startup>0</load-on-startup>
</servlet>
<!-- Standard Action Servlet Mapping -->
<servlet-mapping>
<servlet-name>action</servlet-name>
<!-- 对外访问路径 -->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
* 配置struts-config.xml文件
<struts-config>
<form-beans>
<!--
name属性:该ActionForm的唯一标识
type属性:该ActionForm所在类的完整路径
-->
<form-bean name="loginForm" type="com.itcast.struts.form.LoginForm"></form-bean>
</form-beans>
<!-- 表示请求的集合,可以配置多个action,每个action就是一个ActionMapping -->
<action-mappings>
<!--
/login.do actionServlet解析请求把.do去掉/login
path属性:唯一,就是action的唯一标识
name属性:表示的是一个ActionForm的标识.页面的数据要封装到name属性指定的ActionForm中
该属性值执行必须在form-beans标签中定义的
type属性:指定action的完整路径,常见LoginAction实例,自动调用Action中的execute方法
-->
<action path="/login" name="loginForm" type="com.itcast.struts.action.LoginAction">
</action>
</action-mappings>
</struts-config>
* 发布运行
疑问:
* struts中的javaBean为什么要继承ActionForm?
可以简单理解为,为了方便bean数据的封装和传递.
* javaBean中属性的名称必须为什么和表单页面中组件的name属性的值相同?
以便于底层反射的实现.如果属性名不相同则操作起来将会很麻烦.
* struts的页面表单的数据是怎么封装到javaBean中?
读取struts-config.xml文件可以得到action和actionform的对应关系.然后用反射获取actionForm中的左右set方法,查找与表单匹配的bean,对其进行赋值.
* 控制器组件为什么必须要继承Action
为了重写actoin的execute方法.
* 为什么重写execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
servlet在截取到请求后会调用action的exectue方法。如果不重写则,该action实现类则无意义。
* execute方法的四个参数是怎么传递的
首先,四个参数分别是:(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)。httpServletRequest,和HttpServletResponse参数可以通过actionservlet直接传入。actionMapping其实就是struts-config.xml文件中action的实例,actionForm则是action对应的formBean的实例.底层都是通过反射进行实现的.
截取字符串的常用方法:
a.判断以xxx开头的
//方法的名称是以set
if(m.getName().startsWith("set")){
listMehtod.add(m);
}
b.截取需要的字符串
//获取请求路径
String servletPath=request.getServletPath();
// /login.do ---->/login
//System.out.println("servletPath "+servletPath);
servletPath=servletPath.substring(0,servletPath.lastIndexOf("."));
System.out.println("servletPath "+servletPath); ///login
c.截取需要的字符串(截取set方法后面的值,先转小写,再获取)
System.out.println("^^^^^^^^^^methodname "+methodname); //setUsername
//获取属性
String params=methodname.substring(3,4).toLowerCase()+methodname.substring(4);