转载请标明出处:https://blog.csdn.net/men_ma/article/details/106847165.
本文出自 不怕报错 就怕不报错的小猿猿 的博客
struts入门(struts中的动态调用与参数赋值及与J2EE容器交互,struts通过结果码跳转页面)
1.struts2动态调用方法
1.1 用到的xml文件
1.1.1 先在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>
<!--开启开发者模式 -->
<constant name="struts.devMode" value="true"></constant>
<!--开启自动 加载配置文件 -->
<constant name="struts.configuration.xml.reload" value="true"></constant>
<!--
name:包名(最好根据xml的类名来定义)
extends:继承
abstarct:是否是抽象类
namespace:命名空间
-->
<package name="struts-base" extends="struts-default" abstract="true">
<!-- 配置动态调用 -->
<global-allowed-methods>regex:.*</global-allowed-methods>
</package>
</struts>
1.1.2 在struts-user.xml中配置action的方法
<?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="struts-user" extends="struts-base">
<action name="loginAction_*" class="com.xiaoqing.action.UserAction" method="{1}"></action>
</package>
</struts>
1.2 login.jsp(登录界面的form表单提交地址的action就是动态调用方法去访问后台)
2.参数赋值(利用登录这个小功能:文本框赋值)
2.1 login.jsp中的表单name
2.2 Action中定义属性,并提供get/set方法
当我们的xml文件这些配置好后确认可以访问到userAction这个类的方法时就可以参数赋值了
userAction类:
public class UserAction implements ModelDriven<User> {
// 在action中定义的属性必须定义该属性的set和get方法
private String username;
private String password;
/**
* 登录方法
* @return
*/
public String login() {
System.out.print(username);
System.out.print(password);
return null;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
效果:
2.3 ModelDriven 返回实体,不能为null,不需要提供get/set方法
2.3.1 user.java实体类:
public class User implements Serializable{
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User() {
super();
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
}
2.3.2 userAction类中(注意观察代码):需要实现ModelDriven
public class UserAction implements ModelDriven<User> {
private User user=new User();
// 在action中定义的属性必须定义该属性的set和get方法
private String username;
private String password;
@Override
public User getModel() {
// TODO Auto-generated method stub
return user;
}
/**
* 登录方法
* @return
*/
public String login() {
System.out.println("username="+username);
System.out.println("password="+password);
System.out.println("modledriven中:");
System.out.println("username="+user.getUsername());
System.out.println("password="+user.getPassword());
return null;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
效果:
要点:ModelDriven返回实体和Action中属性重名,ModelDriven中优先级更高
3.struts中跳转页面:重定向或者转发
利用返回的结果码进行跳转,在struts-user.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="struts-user" extends="struts-base">
<action name="loginAction_*"
class="com.xiaoqing.action.UserAction"
method="{1}">
<!--
name:跳转路径
type:默认是转发=dispatcher,重定向=redirect
-->
<!-- <result name="success" type="dispatcher">/index.jsp</result>
<result name="error" type="redirect">/error.jsp</result> -->
</action>
</package>
</struts>
userAction类:
public class UserAction implements ModelDriven<User> {
private User user=new User();
// 在action中定义的属性必须定义该属性的set和get方法
private String username;
private String password;
@Override
public User getModel() {
// TODO Auto-generated method stub
return user;
}
/**
* 登录方法
* @return
*/
public String login() {
if("xiao".equals(user.getUsername())&&"123".equals(user.getPassword())) {
return "success";
}else {
return "error";
}
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
4.与J2EE容器交互
如何理解非注入和注入?
博主大白话:举一个生活的例子,如果我们感冒很严重,要么吃药,要么打针,吃药就代表非注入,打针就代表注入
4.1 非注入方式
耦合和解耦实际上是struts2和servlet的关系
4.1.1 耦合
userAction:
public class UserAction implements ModelDriven<User> {
private User user=new User();
// 在action中定义的属性必须定义该属性的set和get方法
private String username;
private String password;
@Override
public User getModel() {
// TODO Auto-generated method stub
return user;
}
// 非注入耦合方式,和servlet关系紧密
private HttpServletRequest req=ServletActionContext.getRequest();;
private HttpServletResponse resp=ServletActionContext.getResponse();
/**
* 登录方法
* @return
*/
public String login() {
if("xiao".equals(user.getUsername())&&"123".equals(user.getPassword())) {
req.setAttribute("username", user.getUsername());
return "success";
}else {
return "error";
}
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
效果:
4.1.2 解耦(建立使用解耦模式)
userAction类:
public class UserAction implements ModelDriven<User> {
private User user=new User();
// 在action中定义的属性必须定义该属性的set和get方法
private String username;
private String password;
@Override
public User getModel() {
// TODO Auto-generated method stub
return user;
}
/**
* 登录方法
* @return
*/
public String login() {
if("xiao".equals(user.getUsername())&&"123".equals(user.getPassword())) {
// 非注入的解耦方式
ActionContext context = ActionContext.getContext();
Map<String, Object> map = context.getContextMap();
map.put("username", user.getUsername());
return "success";
}else {
return "error";
}
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
效果如上一样
4.2 注入方式(常用)
4.2.1 耦合方式(实现ServletRequestAware/ServletResponseAware接口)
userAction类:
public class UserAction implements ModelDriven<User>,ServletRequestAware,ServletResponseAware {
private User user=new User();
// 在action中定义的属性必须定义该属性的set和get方法
private String username;
private String password;
@Override
public User getModel() {
// TODO Auto-generated method stub
return user;
}
// 注入式的耦合:ServletRequestAware,ServletResponseAware
private HttpServletRequest req;
private HttpServletResponse resp;
@Override
public void setServletResponse(HttpServletResponse response) {
// TODO Auto-generated method stub
this.resp=response;
}
@Override
public void setServletRequest(HttpServletRequest request) {
// TODO Auto-generated method stub
this.req=request;
}
/**
* 登录方法
* @return
*/
public String login() {
if("xiao".equals(user.getUsername())&&"123".equals(user.getPassword())) {
req.setAttribute("username", user.getUsername());
return "success";
}else {
return "error";
}
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
效果(目标效果都是一样的,只是方式不一样):