想想快到年底了,能否来年再找一份高薪的工作呢?这些知识点还是要必备的。那么在我还能记得的时候,将这些东西写下来(全是本人自己总结的很基础很基础的知识点,多偏向于面试方向,你懂的
,好与不好,自己爽就行。这次就慢慢写吧... ...)
一:什么是Struts2?
Struts2是由Struts1和WebWork两个框架整合发展而来的,作用于视图层的优秀的MVC框架(m:模型, v:视图, c:控制器),基于Model2(jsp + servlet + javaBean)的设计模型
二:有必要知道的Struts2的一些jar包?
struts2-core---Struts2框架的核心类库
xwork-core---Command模式框架,struts2和WebWork都要基于xwork
ognl---对象图导航语言
fileupload----文件上传组件
太多了也记不住,就记这几个主要的吧
三:Struts2的相关配置?
1.核心控制器,在web工程下的web.xml配置文件中,配置Struts2的核心控制器,Struts2使用filter过滤器作为其核心控制器:StrutsPrepareAndExecuteFilter过滤器,主要处理已.action结尾的请求,传递到相对应得Action类中
2.Struts2中内置的一些拦截器(功能很强大)
3.strtus.xml是web应用默认的struts配置文件
4.struts-default默认包
四: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>
<constant name="struts.devMode" value="true"/>
<package name="demo1" extends="struts-default">
<action name="hello" class="com.wanghang.struts.Action">
<result name="success">/success.jsp<?result>
</action>
</package>
</struts>
如上所示:struts.xml中主要包括:
五:struts-default默认包有什么作用?
strtus-default是struts内置的,其中定义了struts2内部众多的拦截器和result结果类型,而struts2很多的功能都是通过拦截器实现的。例如封装参数,文件上传下载,数据验证等,而且当包继承了struts-default包才能使用这些拦截器
六:Struts2的请求处理流程?
1.服务器加载web应用程序
2.加载web.xml配置文件,完成对StrutsPrepareAndExecuteFilter过滤器的实例化
3.完成对过滤器的初始化,运行其init()方法
4.在初始化控制器之前,加载struts.xml配置文件
5.用户发起请求,经过过滤器,访问资源,例(http: // localhost:8080 / 工程名 / helloworld.action)
6.从已经加载的struts.xml中寻找<action name="helloworld" class="... ...">的动作标签
7.从而找到相对应的class动作类,进行实例化类,调用方法
8.返回结果视图,找到struts.xml中的结果视图标签<result name="success">
9.再进行页面的跳转helloword.html
七:拦截器和过滤器的区别(面试很可能会问)?
1.拦截器是基于java反射机制的,而过滤器是基于函数回调
2.过滤器要依赖于servlet容器,而拦截器不依赖servlet容器
3.拦截器只能拦截action动作,而过滤器几乎都可以拦截
4.拦截器可以访问值栈里的对象,而过滤器不可以
4.拦截器基于SpringAop(面向切面编程)的思想,功能强大
八:Action类?
sturts2中用户自己写的action类就是一个普通的java类(POJO),但是为了编程规范,Struts2为Action接口提供了一个实现类ActionSupport,其中定义了类似于表单校验,错误信息,获取国际化信息的一些方法。
当用户自定义动作类继承ActionSupport 时,并且自定义方法时,要注意方法的格式:
/**
* 用户自定义动作方法
*/
public String add() {
return SUCCESS;
}
注意:1.方法一定要public修饰
2.方法返回值是String类型(方法返回的是结果视图,具体在后边struts.xml中进行说明)
3.方法无参数
4.继承ActionSupport类时,可以重写execute()方法。
九:参数注入?
十:Action类接收请求参数?
用户名:<input type="text" name="usernaem"/><br/>
密码:<input type="password" name="password"/><br/>
/**
* 动作类充当模型对象
*
* @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;
}
}
用户名:<input type="text" name="usernaem"/><br/>
密码:<input type="password" name="password"/><br/>
/**
* 用户模型类
*
* @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;
}
}
用户名:<input type="text" name="usernaem"/><br/>
密码:<input type="password" name="password"/><br/>
/**
* 模型驱动
*
* @author Hang.W
* @version 1.0, 2016-12-21 00:02:57
*/
public class Action3 implements ModelDriven<UserModel> {
private UserModel userModel = new UserModel();
@Override
public UserModel getModel() {
return this.userModel;
}
}
十一:如何访问ServletAPI?
有两种方式可以获取Servlet API,但是推荐接下来写的这种,主要是通过ActionContext的子类ServletActionContext获取Servlet的API。因此比较简单/**
* 如何获取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注入进来的
十二:OGNL表达式
OGNL:Object Graphic Navigation Language(对象图导航语言),是struts2的默认表达式语言十三:contextMap(很重要,但面试也有可能会问吧)
十四:如何获取值栈对象?
/**
* 通用标签库动作类
*
* @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();
}
}
通过这两个动作可以向值栈中存数据
2. valueStack通过push()方法,可以将数据 压入栈顶
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<String> list;
private Map<String, String> map;
private List<Student> 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<String>();
list.add("张三三");
list.add("李四四");
list.add("王五五");
list.add("赵六六");
list.add("周七七");
map = new HashMap<String, String>();
map.put("zhangsan", "张三");
map.put("lisi", "李四");
map.put("wangwu", "王五");
map.put("zhaoliu", "赵六");
map.put("zhouqi", "周七");
stu = new ArrayList<Student>();
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<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public List<Student> getStu() {
return stu;
}
public void setStu(List<Student> stu) {
this.stu = stu;
}
}
页面上取值要使用OGNL表达式来取值!
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<s:debug></s:debug>
<h1>OGNL表达式:在OGNL表达式中,字符串要使用双引号括起来</h1>
<h2>if, elseif, else</h2>
<s:if test='#grade == "A"'>优秀</s:if>
<s:elseif test='#grade == "B"'>良好</s:elseif>
<s:else>未找到</s:else>
<br/>
<br/>
<h2>iterator</h2>
<s:iterator value="str" var="s">
<s:property value="#s"/>
</s:iterator>
<hr/>
<s:iterator value="list">
<s:property/>
</s:iterator>
<hr/>
<s:iterator value="map" var="entry">
<s:property value="#entry.key"/>==<s:property value="#entry.value"/>
</s:iterator>
<hr/>
<s:iterator value="stu" var="s">
<s:property value="#s.name"/>:<s:property value="#s.age"/>:<s:property value="#s.birthday"/>:<s:property value="#s.city"/>
</s:iterator>
</body>
</html>