前言
Struts作为MVC 2的Web框架,自推出以来不断受到开发者的追捧,得到用广泛的应用。
作为最成功的Web框架,Struts自然拥有众多的优点:
MVC 2模型的使用
功能齐全的标志库(Tag Library)
开放源代码
但是,所谓“金无赤金,人无完人”,Struts自身也有不少的缺点:
需要编写的代码过多,容易引起“类爆炸”
单元测试困难
这些缺点随着Web的发展越来越明显。这就促生了Struts 2.0
环境搭建
前提
- Java相关环境
- maven插件已安装
建立web项目
1、导入Struts2依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.struts/struts2-core -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>${struts2.version}</version>
</dependency>
</dependencies>
2、配置web.xml
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>Archetype Created Web Application</display-name>
<!--struts2中央控制器 -->
<filter>
<filter-name>StrutsPrepareAndExecuteFilter</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>StrutsPrepareAndExecuteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
3、配置struts.xml
struts.xml(核心配置文件):引入其他xml配置
struts.properties(全局属性文件)
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<include file="struts-default.xml"/>
<include file="base.xml"></include>
<include file="sys.xml"></include>
</struts>
base.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<!-- 属性文件 以键和值的方式存在配置到xml里面去 字符编码 dev(开发)模式 改了配置文件会自动加载-->
<constant name="struts.i18n.encoding" value="UTF-8" />
<constant name="struts.devMode" value="true" />
<constant name="struts.configuration.xml.reload" value="true" />
<package name="base" extends="struts-default" abstract="true">
<global-allowed-methods>regex:.*</global-allowed-methods>
</package>
</struts>
sys.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<package name="sys" namespace="/sys" extends="base" >
<action name="bookAction_*" class="com.zking.action.BookAction" method="{1}">
<result name="list">/list.jsp</result>
</action>
</package>
</struts>
4.建立BaseAction
package com.zking.action;
import java.util.List;
import com.opensymphony.xwork2.ModelDriven;
import com.zking.base.BaseAction;
import com.zking.dao.BookDao;
import com.zking.entity.Book;
import com.zking.util.JsonData;
import com.zking.util.PageBean;
public class BookAction extends BaseAction implements ModelDriven<Book> {
private BookDao bd=new BookDao();
private Book b=new Book();
@Override
public Book getModel() {
return b;
}
public String add() {
JsonData jsonData=new JsonData();
bd.addBook(b);
jsonData.setCode(0);
jsonData.setMessage("书本新增成功");
this.toJson(jsonData);
return null;
}
public String list() {
PageBean pageBean=new PageBean();
pageBean.setRequest(request);
request.setAttribute("pageBean", pageBean);
List<Book> listBook = bd.listBook(b, pageBean);
request.setAttribute("listBook", listBook);
System.out.println(listBook);
return "list";
}
}
5.在webapp下建立jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="z" uri="/zking"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>书籍查询</h1>
<table border="1" width="100%">
<tr>
<td>ID</td>
<td>书名</td>
<td>封面</td>
<td>价格</td>
<td>操作</td>
</tr>
<c:forEach var="v" items="${listBook }">
<tr>
<td>${v.bookId }</td>
<td>${v.bookName }</td>
<td>
<c:if test="${v.bookImage !=0 }">
<a href="<%=request.getContextPath()%>/sys/fileAction_saveAs.action?fileId=${v.bookImage }"><img style="width:80px;height:80px;" src="<%=request.getContextPath()%>/sys/fileAction_open.action?fileId=${v.bookImage }"></a>
</c:if>
</td>
<td>${v.bookPrice }</td>
<td><a href="<%=request.getContextPath()%>/bindBookImage.jsp?bookId=${v.bookId }">上传封面</a>
<c:if test="${v.bookImage !=0 }">
<a href="<%=request.getContextPath()%>/sys/fileAction_saveAs.action?fileId=${v.bookImage }">另存为</a>
</c:if>
</td>
</tr>
</c:forEach>
</table>
<z:page pageBean="${pageBean }"/>
</body>
</html>
好啦,初始学习就到这里啦,可以直接复制代码测试玩一下
个人认为struts2需要掌握的重点包含:
- XML是什么含义
- struts2的常用标志
- 关于struts2的action理念
- struts2拦截器的工作原理
- 在struts2中实现IOC、文件上传、CRUD
- struts2中的OGNL表达式
- struts2和ajax如何交互
通过学习struts2你要明白的几个概念:
反射的原理、MVC架构、xml建模
其他知识点
OGNL
1 OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言
2 OgnlContext(ongl上下文)其实就是Map<String,Object>
OgnlContext=根对象(1)+非根对象(N)
非根对象要通过"#key"访问,根对象可以省略"#key"
注意:context:英文原意上下文,容器
3 把根对象和非根对象说出来
附:struts2中ODNL结构图