想想快到年底了,能否来年再找一份高薪的工作呢?这些知识点还是要必备的。那么在我还能记得的时候,将这些东西写下来(全是本人自己总结的很基础很基础的知识点,多偏向于面试方向,你懂的,好与不好,自己爽就行。这次就慢慢写吧... ...)
Struts2是由Struts1和WebWork两个框架整合发展而来的,作用于视图层的优秀的MVC框架(m:模型, v:视图, c:控制器),基于Model2(jsp + servlet + javaBean)的设计模型
struts2-core---Struts2框架的核心类库
xwork-core---Command模式框架,struts2和WebWork都要基于xwork
ognl---对象图导航语言
fileupload----文件上传组件
太多了也记不住,就记这几个主要的吧
1.核心控制器,在web工程下的web.xml配置文件中,配置Struts2的核心控制器,Struts2使用filter过滤器作为其核心控制器:StrutsPrepareAndExecuteFilter过滤器,主要处理已.action结尾的请求,传递到相对应得Action类中
2.Struts2中内置的一些拦截器(功能很强大)
3.strtus.xml是web应用默认的struts配置文件
4.struts-default默认包
/success.jsp
如上所示:struts.xml中主要包括:
strtus-default是struts内置的,其中定义了struts2内部众多的拦截器和result结果类型,而struts2很多的功能都是通过拦截器实现的。例如封装参数,文件上传下载,数据验证等,而且当包继承了struts-default包才能使用这些拦截器
1.服务器加载web应用程序
2.加载web.xml配置文件,完成对StrutsPrepareAndExecuteFilter过滤器的实例化
3.完成对过滤器的初始化,运行其init()方法
4.在初始化控制器之前,加载struts.xml配置文件
5.用户发起请求,经过过滤器,访问资源,例(http: // localhost:8080 / 工程名 / helloworld.action)
6.从已经加载的struts.xml中寻找
7.从而找到相对应的class动作类,进行实例化类,调用方法
8.返回结果视图,找到struts.xml中的结果视图标签
9.再进行页面的跳转helloword.html
1.拦截器是基于java反射机制的,而过滤器是基于函数回调
2.过滤器要依赖于servlet容器,而拦截器不依赖servlet容器
3.拦截器只能拦截action动作,而过滤器几乎都可以拦截
4.拦截器可以访问值栈里的对象,而过滤器不可以
4.拦截器基于SpringAop(面向切面编程)的思想,功能强大
sturts2中用户自己写的action类就是一个普通的java类(POJO),但是为了编程规范,Struts2为Action接口提供了一个实现类ActionSupport,其中定义了类似于表单校验,错误信息,获取国际化信息的一些方法。
当用户自定义动作类继承ActionSupport 时,并且自定义方法时,要注意方法的格式:
/**
* 用户自定义动作方法
*/
public String add() {
return SUCCESS;
}
注意:1.方法一定要public修饰
2.方法返回值是String类型(方法返回的是结果视图,具体在后边struts.xml中进行说明)
3.方法无参数
4.继承ActionSupport类时,可以重写execute()方法。
用户名:
密码:
/**
* 动作类充当模型对象
*
* @Author Hang.W
* @Version 2016-12-20 23:44:53
*
*/
public class Action1 {
private String username;
private String password;
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
}
用户名:
密码:
/**
* 用户模型类
*
* @author Hang.W
* @version 1.0, 2016-12-20 23:51:39
*/
public class UserModel {
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;
}
}
/**
* 动作类与模型对象分开
*
* @author Hang.W
* @version 1.0, 2016-12-20 23:56:39
*/
public class Action2 {
private UserModel userModel;
public UserModel getUserModel() {
return userModel;
}
public void setUserModel(UserModel userModel) {
this.userModel = userModel;
}
}
用户名:
密码:
/**
* 模型驱动
*
* @author Hang.W
* @version 1.0, 2016-12-21 00:02:57
*/
public class Action3 implements ModelDriven {
private UserModel userModel = new UserModel();
@Override
public UserModel getModel() {
return this.userModel;
}
}
/**
* 如何获取ServletAPI
*
* @author Hang.W
* @version 1.0, 2016-12-21 23:40:06
*/
public class Action extends ActionSupport {
@Override
public String execute() {
// 获取Servlet的API
HttpServletRequest request = servletActionContext.getRequest();
HttpSession session = request.getSession();
ServletContext context = servletActionContext.getServletContext();
}
}
另一种相对比较麻烦,但获取原理:是实现ServletRequestAware等接口,是
通过一个叫做ServletConfig的拦截器,将servletAPI注入进来的
/**
* 通用标签库动作类
*
* @author Hang.W
* @version 1.0,2016-12-23 00:06:46
*/
@SuppressWarnings("all")
public class DemoAction1 extends ActionSupport {
@Override
public String execute() throws Exception {
// 获取valuestack对象
ActionContext context = ActionContext.getContext();
ValueStack valueStack = context.getValueStack();
}
}
通过这两个动作可以向值栈中存数据
package com.wanghang.action;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.util.ValueStack;
import com.wanghang.domain.Student;
/**
* 采用第二种方式动作类与模型类分开
*
* @author Hang.W
* @version 1.0,2016-12-23 00:23:47
*/
@SuppressWarnings("all")
public class DemoAction1 extends ActionSupport {
private String[] str;
private List list;
private Map map;
private List stu;
@Override
public String execute() throws Exception {
// 获取valuestack对象
ActionContext context = ActionContext.getContext();
ValueStack valueStack = context.getValueStack();
// 向contextMap中存放数据,第一位是OGNL表达式(如果contextMap中没有需要替换的对象,那么就可以自动创建一个)
valueStack.setValue("#grade", "c");
// valueStack向contextMap中存放数组或集合
str = new String[] { "张三", "李四", "王五", "赵六", "周七" };
list = new ArrayList();
list.add("张三三");
list.add("李四四");
list.add("王五五");
list.add("赵六六");
list.add("周七七");
map = new HashMap();
map.put("zhangsan", "张三");
map.put("lisi", "李四");
map.put("wangwu", "王五");
map.put("zhaoliu", "赵六");
map.put("zhouqi", "周七");
stu = new ArrayList();
Calendar birthday = Calendar.getInstance();
birthday.set(2020, 10, 10);
stu.add(new Student("漩涡鸣人", 18, birthday.getTime(), "北京"));
Calendar birthday2 = Calendar.getInstance();
birthday.set(2010, 5, 5);
stu.add(new Student("路飞", 17, birthday2.getTime(), "上海"));
Calendar birthday3 = Calendar.getInstance();
birthday.set(2015, 7, 7);
stu.add(new Student("无脸男", 19, birthday3.getTime(), "广州"));
return SUCCESS;
}
public String[] getStr() {
return str;
}
public void setStr(String[] str) {
this.str = str;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
public List getStu() {
return stu;
}
public void setStu(List stu) {
this.stu = stu;
}
}
页面上取值要使用OGNL表达式来取值!
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
Insert title here
OGNL表达式:在OGNL表达式中,字符串要使用双引号括起来
if, elseif, else
优秀
良好
未找到
iterator
==
: : :