struts
html
开发模式:MVC模式(Model,View,Control)前端
M-Model模型
java
模型的职责是复杂业务逻辑,包含两部分:业务数据和mysql
业务处理逻辑。好比实体类,DAO,Service都是web
V-View视图spring
视图是负责显示界面和用户交互sql
属于视图的类是不包含业务逻辑和控制逻辑的JSP数据库
C-Conrtrollerr控制器apache
控制器是模型层M和视图层V之间的桥梁,用于控制流程
app
ActionServlet
Struts2 HelloWorld
1)拷贝Struts2的核心jar包到web-inf/lib/下
sturts2-core-2.1.8.1.jar
核心包,
xwork-core-2.1.6.jar
是WebWork内核
ognl-2.7.3.jar
支持ognl表达式,相似于EL表达式
freemarker-2.3.15.jar
commons-fileupload-1.2.1.jar
用于实现文件上传功能的jar包
在web.xml中配置Struts2的前端控制器
用Filter实现的前端控制器
<web-app>
<filter>
<filter-name>Struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.Struts2PrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
新建页面nameform.jsp
<html>
...
<body>
<form action="/outman/day/welcome.action" method="post">
<input name="name" type="text"/>
<input value="提交" type="submit"/>
</form>
...
</html>
新建页面welcome.jsp
...
<body>
<h1> Welcome,$(name)
</h1>
</body>
新建WelcomeAction
public class WelcomeAction{
private String name;
public String execute(){
System.out.println("name" + name);
if("monster".equalsIgnoreCase(name)){
return "fail";
}
return "success";
}
public String getName(){
return name:
}
public void setName(String name){
this.name = name;
}
Sturuts2提供的方便之处:
1数据的自动的封装
根据页面组件的name属性,自动封装到Action中对应的name属性中。
2数据的自动传递
Action中的属性会在jsp页面能够直接用EL表达式拿到
9)写struts2所须要的配置文件struts.xml
struts.xml文件告诉Struts2\请求对应的java类
<struts>
<package name="helloworld" extends="struts-default"
namespace="/day01">
<action name="welcome" class="com.ccc.outman.WelcomeAction">
<result name="success">/jsp/welcome.jsp</result>
<result name="fail">/jsp/nameform.jsp</result>
</action>
</package>
<案例2>
Struts2链接数据库
须要导入的jar包
Struts2的jar包
Mysql的驱动
Jstl的jar包
②建立实体类
id,name,...以及get,set方法
③拷贝database.properties到src目录下
username = root
password = root
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/test
ConnectionUtils.java
public class ConnectionUtils{
private static String url;
private static String driver;
private static String username;
private static String password;
static{
Properties props = new Properties();
try{
//从属性文件中读取数据库配置信息
props.load(ConnectionUtils.class.getClassLoader().getResourceAsStream
("database.properties"));
}catch(IOException e){
e.printStackTrace();
}
if(props != null){
url = props.getProperty("url");
driver = props.getProperty("driver");
username = props.getProperty("username");
password = props.getProperty("password");
//装载并注册数据库驱动
try{
Class.forName(driver);
}catch(ClassNotFoundException e){
e.printStackTrace();
}
public static Connection openConnection() throws SQLException{
return DriverManager.getConnection(url,username,password);
}
conn.close(),stmt.close(),rs.close();
public static void main(String[] args) {
Connection conn = openConnection();
System.out.println(conn);
}
9)新建ProjectDAO
public class ProjectDao{
private static final String findAll =
"select * from t_project";
public List<Project> findAll(){
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try{
conn = ConnectinUtils.openConnection();
stmt = conn.prepareStatement(findAll);
rs = stmt.executeQuery();
List<Project> list = new ArrayList<Project>();
while(rs.next()){
Project project = new Project();
project.setId(rs.getInt(1));
project.setName(rs.getString(2));
projec.....
}
return list;
...
}
public static void main(String[] args){
ProjectDao dao = new ProjectDao();
List<Project> list = dao.findAll();
for(Project p:list){
System.out.println(p.getName());
}}}
11)新建ProjectListAction
public class ProjectListAction{
private List<Project> projectList;
public String execute(){
ProjectDao projectDao = new ProjectDao();
projectList = projectDao.findAll();
return "success";
}
get,set方法
struts2框架中的关于service的做用:
service层配置了事务,由spring管理.
struts的action里调用的时候,通常都调用service层封装的方法.由于service层的方法可能会调用多个DAO层的方法.
举个例子说明一下,假入说我有一个需求,就是银行的转账需求吧,当A给B汇款1000元这个过程,A的账户里应该减小1000元,B的账户应该增长1000元,而这个过程是由2个DAO方法实现的,即A减小的方法,B增长的方法.而service层的转账方法(起名叫getResult方法)里面先调用了DAO层A减小的方法,再调用B增长的方法.配置文件的事务配置的是管理service层的事务,只有service层的转账方法完成了DAO层的两个方法,才算这个事务结束.若是直接调用DAO层的方法,那么spring不会管理事务,每次调用DAO的方法就算单独的一个事务,若是程序运行不稳定,A减小1000元的方法成功,B增长1000元的方法失败的状况下,因为此时的事务不是同一个事务.那么A的事务不会回滚.....结果就是数据库里面A少了1000块钱,B没有增长1000块钱........钱那里去了........出大错了吧,这个错误够严重了吧!
13)配置struts2.xml,web.xml
.jsp文件