Struts基础复习笔记

一.环境搭建
1.1
maven搭建,只需要引入一个核心包即可
<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-core</artifactId>
    <version>2.3.16.1</version>
</dependency>


<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.1.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>


下载对应的Struts2的官方压缩包,然后解压,找到对应的web.xml与struts.xml 放入工程,默认的web.xml中会默认过滤器代码,如果没有手动添加
<filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>


    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


注意:struts.xml中
"http://struts.apache.org/dtds/struts-2.3.dtd" 如果找不到这个文件,非常麻烦,如果是没有网络的情况下,可能会出现
手工导入这个文件,需要在官方包解压后的resources下找到对应的文件,然后在eclipse中preference 找到add XML Catalog Entry 
然后导入这个文件


1.2 配置文件
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<!-- 配置根元素 -->
<struts>
<!--  该标签用于创建一个javabean实例-->
<bean class=""></bean>
  <!--  该标签用于Struts2默认行为标签-->
<constant name="" value=""></constant>
<!--  该标签是包标签,用于区分不同的请求文件的标签,比方说,网站前台请求,网站后台请求-->
<package name=""></package>
   <!--  该标签用于引入其他的xml配置文件-->
   <include file=""></include>


</struts>


二 数据封装机制
2.1 Struts2属性驱动与模型驱动
作用:帮助我们完成了数据自动获取,数据自动封装
属性驱动:


<action name="loginAction" class="com.test.struts2.action.LoginAction">
<result name="success">/index.jsp</result>
</action>
public class LoginAction extends ActionSupport{
private String username;
private String password;
/**

*/
@Override
public String execute() throws Exception {
System.out.println(username);
System.out.println(password);
return "success";
}
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;
}


}
模型驱动:


<!-- modelDriven 为模型封装的拦截器 defaultStack为系统默认的拦截器 -->
<action name="muserlogin" class="com.test.struts2.action.MloginAction">
<result name="success">/index.jsp</result>
<interceptor-ref name="modelDriven"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>


public class MloginAction extends ActionSupport implements ModelDriven<Users>{
Users user=new Users();
@Override
public String execute() throws Exception {
System.out.println(user.getUsername());
System.out.println(user.getPassword());
return "success";
}


@Override
public Users getModel() {
// TODO Auto-generated method stub
return user;
}
//当请求发送到action之前
//调用MloginAction类中getModel()获取要将表单数据封装到哪个实例化的对象中
//获得该对象之后,我们可以获得类的类型
//获得类类型之后,获得类的属性
//request.getParameters获得表单提交的所有数据名
//从而获取值
//如果表单提交的name值,与实体类中的属性名一致
//那么我们将获得表单中的数据封装到user对象当中去
}




Sturts2标签实现模型驱动


<!-- 标签实现模型驱动 -->
<action name="suserlogin" class="com.test.struts2.action.SloginAction">
<result name="success">/index.jsp</result>
</action>
filter类
public class SloginAction extends ActionSupport {
private Users user;

public Users getUser() {
return user;
}


public void setUser(Users user) {
this.user = user;
}


@Override
public St的ring execute() throws Exception {
System.out.println("标签实现");
System.out.println(user.getUsername());
System.out.println(user.getPassword());

return "success";
}

}


实体类
public class Users {
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;
}

}


jsp


 <%@ taglib prefix="s" uri="/struts-tags" %> 引入标签库


标签实现
<s:form namespace="" action="suserlogin" method="post">
<s:textfield name="user.username" />用户名:
<s:password name="user.password" />密码:
<s:submit value="提交" />
</s:form>


2.2 Struts数据封装机制核心原理
利用反射机制来实现,这里代码实例作为理解,用servlet来实现
平时使用注意点,实体类中的属性名,必须要和jsp中的name的属性名一致,如果不一致,就会出现错误


示例


public class BaseServlet extends HttpServlet {


public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);

}
//当请求发送到action之前,
//调用 MloginAction类中getModel() 获取要将表单数据封装到哪个实例化的对象中
//获得到该对象之后,我们可以获得 类类型
//获得类 类型之后。获得类中的属性
// request.getParameters获得 表单提交的所有数据名
// 从而获取值
// 如果表单提交的 name值 与 实体类中属性名一致
//那么我们将获得表单中的数据 封装到us对象当中去
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
//在程序运行时 获得当前类的getModel方法对象
Method method = this.getClass().getDeclaredMethod("getModel", null);
//通过invoke方法 调用该方法 获得实体类对象
Object ob = method.invoke(this, null);
//通过实体类对象获得  类类型
Class cl = ob.getClass();
//通过类类型获得 类中的属性对象数组
Field[] fi = cl.getDeclaredFields();
//通过request获得所有的 表单中提交的name值 
Enumeration em = request.getParameterNames();
//循环枚举中的值
while(em.hasMoreElements()){
//获得枚举中的值  就是表单提交的name值
String fieldName = em.nextElement().toString();
System.out.println("从表单中获得的 name值;"+fieldName);
//循环类中所有的属性对象
for(int i =0;i<fi.length;i++){
System.out.println("从类中获得的属性:"+fi[i].getName());
//判断 如果类中属性的名字 和 表单中提交的名字一致
if(fieldName.equals(fi[i].getName())){
fi[i].setAccessible(true);//尤为重要,可以被外部赋值
//获取request.getParameter(fieldName) 封装到对象中
fi[i].set(ob, request.getParameter(fieldName));
}
}
}
//调用默认的方法 执行处理
Method me1 = this.getClass().getDeclaredMethod("execute", null);
//获得返回的url字符串
Object url = me1.invoke(this, null);
//根据返回的字符串 跳转页面
request.getRequestDispatcher(String.valueOf(url)).forward(request, response);

} catch (Exception e) {
e.printStackTrace();
}
}
}


public class LoginServlet extends BaseServlet {
//http://www.jikexueyuan.com/course/530.html

private Users us = new Users();


public String execute() throws Exception {
System.out.println("自动封装数据后的结果:");
System.out.println(us.getUsername());
System.out.println(us.getPassword());
return "/index.jsp";
}


public Users getModel() {
// TODO Auto-generated method stub
return us;
}



}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值