三层架构相当于MVC中的model层。而servlet充当控制器
设计模式是针对请求与相应的
MVC是在三层架构的基础上的
Strutc2是针对mvc设计模式的一套框架(所谓的框架是一种重复使用的解决方案)
Struts1的耦合度不好,里面有许多servlet
而在struts2中,其是将servlet都封装了
优点:
Struts2与servletAPI进行了解耦,即对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常量被定义,在不使用接口时,不能进行常量返回
第三种开发方式
推荐使用
继承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页面里面,每个表单的属性名是 实体类名.属性名
在返还的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来处理,实现方式:
实现方式:
<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>