struts2的架构,如图:
实现流程:
- 客户端发送请求到中央控制器
- 获取请求的URL
- 根据URL找到对应的Action类
- 执行Actio类中对应的方法
- 获取方法的返回值(String类型)
- 根据返回值找到对应的jsp页面
- 给客户端做出回应。
具体操作:
1.导入相应的JAR包,配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>struts2_test</display-name>
<!-- 配置Struts2中央控制器 -->
<filter>
<!-- 配置Struts2核心Filter的名字 -->
<filter-name>struts2</filter-name>
<!-- 配置Struts2核心Filter的实现类 -->
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<!-- 配置Filter拦截的URL -->
<filter-mapping>
<filter-name>struts2</filter-name>
<!-- 配置Struts2的核心FilterDispatcher拦截所有用户请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
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>
<!-- 修改默认请求后缀(login.action/login.do/login) -->
<constant name="struts.action.extension" value="action,do,,"></constant>
<!-- 加载product的action配置 -->
<include file="struts-product.xml"/>
<include file="struts-user.xml"/>
<include file="struts-file.xml"/>
</struts>
- struts2中默认的请求后缀是.action,可以在struts.xml中通过写
<constant name="struts.action.extension" value="action,do,,"></constant>
更改请求后缀
- 如果struts.xml中配置太多,可以通过
<include file="struts-user.xml"/>
引入各模块的xml,这样写更清晰,更便于管理
以struts-user.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>
<package name="user" extends="struts-default" namespace="/user">
<action name="login" class="com.xingguo.action.UserAction" method="loginForm">
<result>/WEB-INF/views/user/login.jsp</result>
</action>
<action name="logins" class="com.xingguo.action.UserAction" method="login">
<result type="redirectAction">
<param name="namespace">/product</param>
<param name="actionName">list</param>
</result>
<result name="error" type="redirectAction">
<param name="namespace">/user</param>
<param name="actionName">login</param>
<param name="code">${code}</param>
</result>
</action>
</package>
</struts>
- 最外面是标签
- 里面是标签。name属性,表示package的名字,可以让其他的package继承;extends属性表示继承,可以继承struts2的struts-default,也可以继承自定义的包名,自定义的包名也要继承struts2的struts-default;namespace属性表示命名空间,是指url访问的路径。
- 标签中,name是url中的请求名。class表示Action所在的位置,method表示Action类中的方法
- 标签中name为返回值,默认为SUCCESS,type指类型,默认是dispatcher请求转发,可以写redirectAction重定向等。
3.在Aaction类写相应的方法
package com.xingguo.action;
import com.xingguo.entity.User;
import com.xingguo.service.UserService;
public class UserAction extends BaseAction{
private static final long serialVersionUID = 1L;
private UserService userService = new UserService();
private User user;
private String code;
//进入登录页面
public String loginForm(){
return SUCCESS;
}
//登录
public String login(){
System.out.println(user.getUserName());
System.out.println(user.getPassword());
User loginUser = userService.login(user);
System.out.println("user"+loginUser);
if(loginUser != null){
putSession("user", loginUser);
return "success";
}else{
code = "1002";
return "error";
}
}
//get set
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
4.JSP页面
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link href="http://cdn.staticfile.org/twitter-bootstrap/2.3.2/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<s:actionerror/>
<form action="<%=request.getContextPath()%>/user/logins" method="post">
<label>用户名</label>
<input type="text" name="user.userName"/>
<label>密码</label>
<input type="password" name="user.password"/>
<div class="form-actions">
<button class="btn btn-success" type="submit">进入系统</button>
</div>
</form>
</div>
</body>
</html>