struts2入门

时间:2023-03-08 21:44:13
struts2入门

好久没有动博客了。今天看了一下慕课网的视频,简单了解一下struts2。

首先是在项目中引入struts2的文件,有一个比较简单的方法就是可以直接右键项目MyEclipse->Project facets->install struts2

然后是在web.xml中进行相应的配置(filter过滤器),这里和不使用框架基本类似,代码如下,系统好像会自动生成默认的过滤,如下

 <?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_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>TryStruts2</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>struts.action.extension</param-name>
<param-value>do</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!--
<filter>
<filter-name>struts2_1</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2_1</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
-->
</web-app>

web.xml

然后写一个action文件,如下

 package com.imooc.action;

 import javax.servlet.http.HttpServletRequest;
import com.opensymphony.xwork2.ActionSupport; public class HelloWorldAction extends ActionSupport { private HttpServletRequest request; //helloworld.action public String add(){
// return SUCCESS;
return "add";
} public String update(){
// return SUCCESS;
return "update";
}
@Override
public String execute() throws Exception {
System.out.println("执行Action");
return SUCCESS;
} }

HelloWorldAction

然后是struts.xml文件,里面通过include引入了另外一个配置文件helloworld.xml

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
<include file="helloworld.xml"></include> <constant name="struts.action.extension" value="do"></constant> <!-- 感叹号方式 -->
<!-- http://localhost:8080/TryStruts2/helloworld!add.action -->
<constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>
</struts>

struts.xml

<constant name="struts.action.extension" value="do"></constant>这行代码是进行访问后缀的设置,也可以在web.xml中设置,value用逗号分隔

有三种动态的方法调用action ,一种是指定method属性,一种是用感叹号方式,但是最推荐的是用通配符的方式,所以前两种方式在代码中注释了

<constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>   value设置为true就能开启感叹号访问方式

下面是helloworld.xml的代码,里面有注释就不进行详细分析了

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 映射 -->
<!-- Action搜索顺序 1.判断当前包是否存在(存在2.1 不存在2.2) 2.1判断action是否存在,不存在则去默认namespase的package里面寻找action
2.2检查上一级路径的package是否存在,直到默认namespace --> <package name="default" namespace="/" extends="struts-default"> <!-- 默认action -->
<default-action-ref name="index"></default-action-ref>
<action name="index">
<result>/error.jsp</result>
</action> <action name="*_*_*" method="{2}" class="com.imooc.{3}.{1}Action">
<result>/result.jsp</result>
<result name="add">/{2}.jsp</result>
<result name="update">/{2}.jsp</result>
</action> <!-- 指定method属性 <action name="addAction" method="add" class="com.imooc.action.HelloWorldAction">
<result>/add.jsp</result> </action> <action name="updateAction" method="update"
class="com.imooc.action.HelloWorldAction"> <result>/update.jsp</result> </action> -->
</package> </struts>

helloworld

比如上面的配置访问路径就为http://localhost:8080/TryStruts2/HelloWorld_add_action.do或者action或者html

下面介绍一下action接收参数的3个方式 ,这里推荐一篇博客,写的很详细规范。但是我还是自己写一遍毕竟强迫症。

http://www.cnblogs.com/bukudekong/archive/2012/03/29/2423064.html

表示感觉炒鸡神奇,再次暴露看的书少- -之前都是用的request

1.使用Action的属性接收参数

首先是login.jsp,主要是一个表单,注意input的name属性

<form action="LoginAction.action" method="post">
用户名:<input type="text" name="username" />
密码:<input type="password" name="password" />
<input type="submit" value="提交" />
</form>

然后是LoginAction

 package com.imooc.action;

 import com.opensymphony.xwork2.ActionSupport;

 public class LoginAction extends ActionSupport {

     //action 属性取值
private String username;
private String password; public String login(){
System.out.println(username); return SUCCESS;
} 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;
}
}

LoginAction

最后在helloworld.xml进行action配置

<action name="LoginAction" method="login" class="com.imooc.action.LoginAction">
<result>/success.jsp</result>
</action>

2.使用DomainModel接收参数

首先是login.jsp  input的name相应的更改了

<form action="LoginAction.action" method="post">
用户名:<input type="text" name="user.username" />
密码:<input type="password" name="user.password" />
<input type="submit" value="提交" />
</form>

然后是一个po实体类

 package com.imooc.po;

 public class User {

     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;
}
}

User

然后是LoginAction

 package com.imooc.action;

 import com.imooc.po.User;
import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport { private User user; public String login(){
System.out.println(user.getUsername()); return SUCCESS;
} public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
}
}

LoginAction

3.使用ModelDriven接收参数,感觉这个好叼

首先是表单 input的name改了,使用前要加这个,类似jstl标签<%@ taglib prefix="s" uri="/struts-tags" %>

<form action="LoginAction.action" method="post">
用户名:<input type="text" name="username" /><s:fielderror name="username"></s:fielderror>
密码:<input type="password" name="password" />
书籍1:<input type="text" name="bookList[0].username" />
书籍2:<input type="text" name="bookList[1].username" />
年龄:<input type="text" name="age" />
<input type="submit" value="提交" />
</form>

然后是实体类

 package com.imooc.po;

 import java.util.List;

 public class User {

     private String username;
private String password;
private int age;
private List<User> bookList;
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 List<User> getBookList() {
return bookList;
}
public void setBookList(List<User> bookList) {
this.bookList = bookList;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
} }

User

然后是LoginAction

 package com.imooc.action;

 import com.imooc.po.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven; public class LoginAction extends ActionSupport implements ModelDriven<User>{ private User user=new User(); public String login(){ System.out.println(user.getUsername());
System.out.println(user.getBookList().get(0).getUsername());
System.out.println(user.getBookList().get(1).getUsername()); return SUCCESS;
} @Override
public User getModel() {
return user;
} @Override
public void validate(){
if(user.getUsername()==null||"".equals(user.getUsername())){
this.addFieldError("username", "用户名不能为空");
}
}
}

LoginAction

validate()方法用于验证用户名是否为空

在helloworld.xml中添加 用户处理表单验证不正确时返回登陆页

<action name="LoginAction" method="login" class="com.imooc.action.LoginAction">
<result>/success.jsp</result>
<!-- 表单验证不正确 -->
<result name="input">/login.jsp</result>
</action>

下面是5中处理结果类型struts2入门

写的有点乱,简单记录一下