Struts2
Spring MVC
Struts2 简介
- 来自Apache基金会的软件: http://struts.apache.org
- Struts2 与 Struts1 完全没有关系
- Struts2 的前身是 WebWorks
- Spring MVC\Struts2\Struts1 都是 MVC 模式的Web框架
- MVC是非常流行的 用户界面设计模式。
- MVC是3层架构中的表现层。
配置Struts2
配置步骤:
- 下载Struts2的jar包
- 从struts.apache.org 下载
- 解压缩
- 将*.jar复制到 /WEB-INF/lib 文件夹
- 使用maven下载
- 使用Eclipse内嵌搜索,搜索到 struts2-core 的“坐标(xml)”,保存pom.xml
- 使用 maven.tedu.cn/nexus (maven.aliyun.com/nextus) 在线搜索, 搜索到 struts2-core 的“坐标(xml)”,保存pom.xml
- 从struts.apache.org 下载
- 配置主控制器
- 控制器类
- org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
- 在struts-core-xxxx.jar 包中
- 编辑文件 web.xml(部署描述文件)
- filter
- filter-mapping
- 控制器类
- 添加struts的配置文件
- 位置:package中(classpath中)
- 文件名:struts.xml, struts的filter会自动按照文件名struts.xml找到这个文件, 文件名不能错!!!
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<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_2_5.xsd"
version="2.5">
<!-- Struts2 MVC 配置 -->
<!-- filter 会自动找package中的struts.xml -->
<filter>
<filter-name>mvc</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>mvc</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
空白 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>
</struts>
Hello World!步骤
- 修改配置文件struts.xml 添加web请求的处理路径
-
- namespace="/test" 表示处理一级路径 /test
- extends="struts-default" 继承现有struts的参数
-
- name="hello"处理2级路径 /test/hello.action
- class="com.tedu.HelloAction"
- 在处理url请求时候执行HelloAction 的 execute() 方法,
- execute方法一定有String返回值,常见的值有 "success" "error"
- /WEB-INF/msg.jsp
- 与action方法的返回值配合, 表示返回 “success”时候,转发到msg.jsp页面,msg.jsp作为用户看的视图。
-
- 添加类 com.tedu.HelloAction
- 包含 String execute()
- 方法中 return "success";
- 添加 /WEB-INF/msg.jsp
struts.xml 文件参考:
<?xml version="1.0" encoding="UTF-8"?>
<!-- struts.xml -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 用于配置请求路径与控制器的匹配关系 -->
<!-- /test 请求被这个包进行处理 -->
<package name="test" namespace="/test"
extends="struts-default">
<!-- 请求/test/hello.action时候
执行HelloAction的execute()方法 -->
<action name="hello"
class="com.tedu.HelloAction">
<!-- execute方法返回success
时候,转发到msg.jsp-->
<result name="success">
/WEB-INF/msg.jsp
</result>
</action>
</package>
</struts>
HelloAction.java :
package com.tedu;
public class HelloAction {
/**
* 方法名必须是execute
*/
public String execute(){
System.out.println("Hello World!");
//返回值时候success
return "success";
}
}
msg.jsp:
<%@ page language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hello</title>
</head>
<body>
<h1>Hello World!</h1>
</body>
</html>
由控制器向页面传递消息
- 在控制器中添加属性,并且为属性添加get方法
- 在控制器方法中向属性赋值
- 在JSP页面上使用 EL 表达式读取属性值
- EL表达式实际上执行属性的get方法,如果没有get方法就无法获取属性值。
案例:
HelloAction
public class HelloAction {
private String message;
public String getMessage() {
return message;
}
/**
* 方法名必须是execute
*/
public String execute(){
message = "Hi";
System.out.println("Hello World!");
//返回值时候success
return "success";
}
}
msg.jsp
<%@ page language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hello</title>
</head>
<body>
<h1>Hello World!</h1>
<!-- 自动调用getMessage方法获取信息 -->
<h2>${message}</h2>
</body>
</html>
从页面向控制器传递值
有两种方式可以从页面向控制器传输数据:
- 基本Bean属性传递方式
- 域模型属性传递方式
1. 基本属性传递方式
- 在控制器中声明与html表单项 name 属性一致的Bean属性。
- 添加Bean属性的getxxx setxxx方法。
- Struts会在接受请求时候,自动将表单属性值注入到 Bean 属性中
代码:
Login.jsp
<%@ page language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c"
uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<!-- /WEB-INF/login.jsp -->
<html>
<head>
<meta charset="utf-8">
<title>登录</title>
</head>
<body>
<h1>登录</h1>
<c:url var="url"
value="/user/login.action"/>
<form action="${url}" method="post">
<div>
<label>用户名:</label>
<input type="text"
name="username"/>
</div>
<div>
<label>密码</label>
<input type="password"
name="password">
</div>
<div>
<input type="submit" value="登录">
</div>
</form>
</body>
</html>
LoginAction.java
public class LoginAction {
private String username;
private String password;
//getxxx setxxx 称为:Bean 属性访问方法
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String execute(){
System.out.println(
username + "," + password);
//完整的登录逻辑...待续
return "success";
}
}
ok.jsp
<%@ page language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>成功消息</title>
</head>
<body>
<h1>欢迎 ${username}</h1>
</body>
</html>
struts.xml (片段)
<package name="user"
namespace="/user"
extends="struts-default">
<!--显示登录页面/user/loginForm.action-->
<action name="loginForm">
<result>/WEB-INF/login.jsp</result>
</action>
<!-- 处理登录请求/user/login.action -->
<action name="login"
class="com.tedu.LoginAction">
<result name="success">
/WEB-INF/ok.jsp
</result>
</action>
</package>
2. 域模型属性传递方式
利用域模型打包传递表单数据, 优点: 1. 可以便捷的处理表单输入项目很多 2. 特别是在表单被项目重用时候,显得更加方便。
原理:
步骤: 1. 创建域模型对象 User - 添加属性 id 和 pwd - 添加bean属性访问方法 2. 在控制器中添加User属性user和get set方法 3. 在表单中的输入项目name属性值为:user.id
代码:
User.java
public class User implements Serializable{
private String id;
private String pwd;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User [id=" + id + ", pwd=" + pwd + "]";
}
}
Login2Action.java
public class Login2Action {
private User user;
public void setUser(User user) {
this.user = user;
}
public User getUser() {
return user;
}
public String execute(){
System.out.println(user);
//其他登录逻辑
return "success";
}
}
login2.jsp (片段)
<h1>登录</h1>
<c:url var="url"
value="/user/login2.action"/>
<form action="${url}" method="post">
<div>
<label>用户名:</label>
<input type="text" name="user.id"/>
</div>
<div>
<label>密码</label>
<input type="password" name="user.pwd">
</div>
<div>
<input type="submit" value="登录">
</div>
</form>
struts.xml(片段)
<!-- 显示 login2.jsp -->
<action name="login2Form">
<result>/WEB-INF/login2.jsp</result>
</action>
<action name="login2"
class="com.tedu.Login2Action">
<result name="success">
/WEB-INF/ok.jsp;
</result>
</action>