三层架构相当于MVC中的model层。而servlet充当控制器
设计模式是针对请求与相应的
MVC是在三层架构的基础上的

Strutc2是针对mvc设计模式的一套框架(所谓的框架是一种重复使用的解决方案)
Struts1的耦合度不好,里面有许多servlet
而在struts2中,其是将servlet都封装了

优点:
Struts2servletAPI进行了解耦,即对servlet进行了封装
Struts2提供了拦截器,使用的是AOP编程
Struts提供了类型转换器
开发struts的应用的程序
需要下载struts的jar包

下载地址:​https://archive.apache.org/dist/struts/2.3.37/struts-2.3.37-all.zip​

Apps目录,struts2提供的实例应用
Docs struts2文档
Lib jar包
Src 源程序

Struts2-core-xxx.jar struts2框架的核心库
Xwork-xxx.jar xwork类库,struts2的构建基础
Ognl-xxx.jar struts2使用的一种表达式语言库
Commons-fileupload-xxx.jar struts文件上传依赖包

继承Action接口开发
SUCCESS常量被定义,在不使用接口时,不能进行常量返回

SSH框架之struts_ico


第三种开发方式

推荐使用

继承ActionSupport,推荐使用,并且ActionSupprot在struts中如果没有配置相应的action类,那么struts默认就会调用ActionSupport这个类去处理

name=“user.userid” name="user.password"

login.jsp

<div class="form-group">
<div class="field field-icon-right">
<input type="text" class="input input-big" name="user.userid"
placeholder="登录账号" data-validate="required:请填写账号" /> <span
class="icon icon-user margin-small"></span>
</div>
</div>
<div class="form-group">
<div class="field field-icon-right">
<input type="password" class="input input-big" name="user.password"
placeholder="登录密码" data-validate="required:请填写密码" /> <span
class="icon icon-key margin-small"></span>
</div>
</div>

</div>
<div style="padding: 30px;">
<input type="submit"
class="button button-block bg-main text-big input-big"
value="登录">
</div>

UserAction.java

private List<UserInfo> userinfo;
private int userid;


public int getUserid() {
return userid;
}

public void setUserid(int userid) {
this.userid = userid;
}

public List<UserInfo> getUserinfo() {
return userinfo;
}

public void setUserinfo(List<UserInfo> userinfo) {
this.userinfo = userinfo;
}

public String execute(){
UserInfoService userservice=new UserInfoServiceImpl();
userinfo=userservice.getUser();
for(Object o:userinfo){
UserInfo user=(UserInfo) o;
System.out.println(user.getId()+user.getName()+user.getPassword());
}
return SUCCESS;
}

在jsp页面里面,每个表单的属性名是 实体类名.属性名

SSH框架之struts_数据_02

在返还的jsp页面中,其保证属性名相同即可获取到数据:

<c:forEach items="${booklist }" var="book">
<tr>
<td>${book.id }</td>
<td>${book.name }</td>
<td><img src=${book.info } ></td>
<td>
public String execute(){//该方法是约定俗成的,返回值未success  必须要使用这个方法

if(user.getUserid().equals("admin")&&user.getPassword().equals("123")){
//需要servlet的接口来实现session
//首先获取action的上下文对象
ActionContext actioncontext=ActionContext.getContext();
Map<String,Object> sessionmap=actioncontext.getSession();//map是键值对的形式
//获取session的对象,存储了所有的session集合
sessionmap.put("username", user.getUserid());
return SUCCESS;
}else{
return "relogin";
}
}

将Action的数据传递给jsp页面,通过Servlet里面的api的接口(对象)来实现

通过HttpSession Cookie HttpServletRequest HttpServletResponse

其余的request与cookie等都可以ActionContext来获取

对于Action的总结

其将需要页面提交处理的数据

处理页面发给服务器的数据
将服务器的数据转移到页面的桥梁
充当的是指向哪个数据页面,或者说是指向哪个action
开发方式
直接方式,普通的java类,类中的方法有一个返回的字符串
继承Action接口的

.struts中的package的说明

Package是把功能相似的action 组织在一起。方便使用namespace 就是访问的路径

Actionn元素之method属性

针对同一模块的不同功能 增删改查

Method是针对同一个action中,为了减少action的开发数量

​http://localhost:8080/LibraryBook/admin/user_delete!delete.action​

要想运行动态方法配置需要在struts.xml中配置允许配置动态方法

Java的方法

public String add(){
return SUCCESS;

}
public String detail(){
return SUCCESS;

}
public String search(){
return SUCCESS;

}
public String delete(){
return SUCCESS;

struts的配置

<package name="admin" namespace="/admin" extends="struts-default"><!-- namespace 访问路径 -->
<action name="userlist" class="LibraryAction.UserAction">
<result name="success">/book.jsp</result>

</action>
<action name="user_add" class="LibraryAction.UserAction" method="add">
<result name="success">/adduser.jsp</result>
</action>
<action name="user_delete" class="LibraryAction.UserAction" method="delete">
<result name="success">/deleteuser.jsp</result>
</action>
<action name="user_detail" class="LibraryAction.UserAction" method="detail">
<result name="success">/detailuser.jsp</result>
</action>
<action name="user_search" class="LibraryAction.UserAction" method="search">
<result name="success">/searchuser.jsp</result>
</action>
</package>

​http://localhost:8080/LibraryBook/admin/user_delete!delete.action​

Method 方便动态方法的调用,利于开发

通配符的使用
通配符的配置,为了减少在struts中的action配置的数量
需要在开发时约定一个命名规则,比如action的name名字
User_方法名

<action name="user_*" class="LibraryAction.UserAction" method="{1}">
<result name="success">/{1}user.jsp</result>
</action>

*注意:就是从左到右的占位符,这个占位符一般就是在action中 放入name中配置,后面表示占位符的内容就用{1}等来表示,占位符的位置从1开始

404

当一个请求路径无效时,会默认跳转到action 404处理,使用默认的action来处理,实现方式:
实现方式:

SSH框架之struts_struts_03

<package name="default" namespace="/" extends="struts-default"><!-- namespace 访问路径 -->
<default-action-ref name="defaultaction"></default-action-ref>
<action name="login" class="LibraryAction.LoginAction">
<result type="redirect" name="success">/index.jsp</result>

<result name="relogin">/login.jsp</result>

</action>
<!-- 默认的action处理 -->
<action name="defaultaction">
<result >/404.jsp</result>
</action>

</package>

请求乱码处理方式

<constant name="struts.i18n.encoding" value="utf-8"></constant>