要使用一个框架,首先需要做的是配置基本环境,struts2的基本配置包括:
1导入基本jar包;
2web.xml中配置核心控制器filter;
3struts中配置;
新建web project–>添加项目名称–>target Runtime(选的是程序运行时的默认服务环境),选择自己添加的Apache Tomcat8.0–>勾选Generate Web.xml deployment..—>finish完成项目点创建
创建好了项目以后,首先将使用struts2框架的几个包拷贝到lib目录下
然后在web.xml中配置核心控制器:
<?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>Day01_struts2.0</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 配置核心控制器 -->
<filter>
<filter-name>struts2</filter-name>
<filterclass>
org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
接着,在src目录下新建一个xml文件,命名为struts.xml,在struts.xml中需要配置:
首先 找到web App libraries —>struts2-core-2.5.13.jar—>随便找一个struts-2.dtd文件,打开,复制
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
然后配置添加一对> struts>标签配置一套struts.xml文件的标记符的配置标准,如果能自动生成就表名配置成功,接着配置接收用户请求的方式和处理请求的界面以及请求处理完成后相应跳转的界面:
<struts>
<constant name="struts.configuration.xml.reload" value="true"></constant><!-- 设置xml每次保存都自动刷新 -->
<package name="user" extends="struts-default" namespace="/user">
<!-- name属性 觉决定了该action处理用户的哪个请求,class属性决定了Action的实现类,method标识类中的实现方法-->
<action name="usersave" class="com.nuc.zb.controler.UserControler"
method="save">
<!-- result在匹配成功控制层处理请求返回的name信息后,定义将要跳转的界面 -->
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
接下来,新建一个.java文件UserController.java,作为处理用户请求的控制层:
package com.nuc.zb.controler;
public class UserControler {
public String save(){
System.out.println("save");
return "success";
}
}
然后struts框架就配置完成并可测试了,启动服务,在浏览器地址栏输入http://localhost:8080/111/user/usersave进行测试,测试成功,进入index.jsp
MVC思想将一个应用程序分为model,view,control三层,三个部分以最小的耦合协同工作,提高了应用程序的可扩展性,可维护性
在struts 的mvc实现中,model对应的是业务逻辑组件,通常实现业务逻辑方法和底层数据交互;view层对应视图组件,jsp页面等;control层对应的是核心控制器(一般指struts2提供的FilterDiapatcher,会根据请求自动调用相应的action)以及业务逻辑控制器(一般指开发人员自行定义的一系列action,action中负责调用相应的业务逻辑组建完成处理)
使用struts 框架时,用户的请求首先被web.xml中的filter获取,然后传到struts.xml中,去匹配是否有处理请求的类,找到之后,回去该类中调用相应的方法进行业务逻辑处理,一般命名UserAction.java作为开发人员定义的控制层处理数据,UserAction的使用一般有三种方法:
1:第一种就是之前栗子,一个普通的java文件,只能够处理简单的业务逻辑,处理起来比较麻烦,尤其是在获取客户端传递的数据时,需要通过request.getParamenters(“”)这样的方法
2:实现Action接口:
import com.opensymphony.xwork2.Action;
//第二种Action的使用方式------>实现Action接口:
public class UserAction2 implements Action{
//execute方法,表示在xml中如果没有设置对接受的数据进行处理的具体的方法,则传到本Action当中时,默认执行execute方法
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return this.SUCCESS;
}
//这是一个自定义的方法,如果用户请求query,那么xml设置UserAction2为处理请求的类的时候,会在UserAction中自动调用query方法,可以在query方法中进行业务逻辑的处理
public String query(){
return this.SUCCESS;
}
}
3:继承ActionSupport类:
import com.opensymphony.xwork2.ActionSupport;
//这是Action使用的第三种方式,定义一个类,去继承AactionSuport类
//ActionSupport是Action接口的一个实现类,除了实现了Action接口还实现了Validateable(用于验证)等接口,开发中常用的功能都已有实现了,所以一般我们就使用这种方式书写Action
public class UserAction3 extends ActionSupport{
//类体中可写入方法,用于业务逻辑处理
public String insert(){ //insert方法,接收用户在浏览器输入的user/user_insert请求,返回insert给xml
return "insert";
}
public String addall(){
return "success";
}
}
框架的出现极大的方便了应用程序的开发,要进行应用程序的开发,当然免不了要与用户,数据库进行交互,struts2框架中提供了两种极为方便的在Action当中获取客户端提交过来的数据的方法:我们称之为1:属性驱动,2模型驱动;接下来我们用Actoin继承AactionSuport类的方法来做一个获取用户提交过来的数据的功能,以属性驱动或模型驱动的方式:
属性驱动:
首先模型层:
public class UserModel {
private String username;
private String password;
private String truename;
private int userid;
public UserModel(String username, String password, String truename, int userid) {
super();
this.username = username;
this.password = password;
this.truename = truename;
this.userid = userid;
}
public UserModel() {
super();
}
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 String getTruename() {
return truename;
}
public void setTruename(String truename) {
this.truename = truename;
}
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
@Override
public String toString() {
return "UserModel [username=" + username + ", password=" + password + ", truename=" + truename + ", userid="
+ userid + "]";
}
}
连接数据库,dao层,service层就不写了,都是一样的套路
用户发起请求时,由web.xml中到struts.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.configuration.xml.reload" value="true"></constant><!-- 设置xml每次保存都自动刷新,不需要restart -->
<package name="user" extends="struts-default" namespace="/user">
<action name="user_insert" class="com.nuc.zb.controler.UserAction3" method="insert">
<!-- xml接收UserAction中的insert方法的返回值并与result中的name值匹配成功,用户成功跳转到insert.jsp -->
<result name="insert">/insert.jsp</result>
</action>
</package>
</struts>
找到处理请求的对应的UserAction:
import com.opensymphony.xwork2.ActionSupport;
public class UserAction3 extends ActionSupport{
//类体中可写入方法,用于业务逻辑处理
private String username;
private String password;
private String truename;
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 String getTruename() {
return truename;
}
public void setTruename(String truename) {
this.truename = truename;
}
public String insert(){ //insert方法,接收用户在浏览器输入的user/user_insert请求,返回insert给xml
return "insert";
}
public String addall(){ //处理表单提交过来的数据,将这条数据添加到数据库中,首先需要获取表单提交过来的数据
/**
* 获取表单中提交过来的数据(或者是说获取客户端传来的数据,在框架的学习中一共有两种方法,第一种称为属性驱动,就是在UserAction.java中定义要获取的字段值,并设置get/set方法,然后就可以直接获取使用)
*/
System.out.println(username);
System.out.println(password);
System.out.println("success");
return "success";
}
}
用户交互界面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="user/user_add" method="post">
<!-- 用户填写表单,表单提交后交给xml中action标签中name属性值为user_add 来处理-->
用户名<input type="text" name="username" value="${user.username }">
密码<input type="password" name="password" value="${user.password }">
姓名<input type="text" name="truename" value="${user.truename }">
<input type="submit" value="提交" />
</form>
This is insert.jsp JSP page.
<br>
</body>
</html>
启动服务,在地址栏输入http://localhost:8080/111/user/user_insert之后,就会进入表单页面,当添加表单数据并点击提交时,控制台就会输出用户刚刚填写的信息,表明已获取用户数据。。。
模型驱动:
模型驱动不同于属性驱动的是,保存的是一个model对象,还需要Action继承ModelDriven,:
UserAction.java:
import com.nuc.zb.model.UserModel;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class UserAction4 extends ActionSupport implements ModelDriven<UserModel>{
private UserModel model;
@Override
public UserModel getModel() {
// TODO Auto-generated method stub
return model;
}
public String query(){
System.out.println(model.getUsername());
System.out.println(model.getPassword());
System.out.println(model.getTruename());
return "success";
}
}
模型驱动的优势在于,将用户提交的数据保存与javabean中,模型层,控制层,与页面的绑定性不强
刚刚我们在配置struts.xml的时候,是这样配置的:
<action name="user_insert" class="com.nuc.zb.controler.UserAction3" method="insert">
struts中一共有两种配置方法,一种是静态配置(推荐),一种是动态配置(不推荐),静态配置有两种:一种就是之前写的配置方法,每个请求都配置一个action,这种方法简单明了,但是当可能的请求多了之后,不免看的凌乱,还有一种是用通配符:
<action name="user_*" class="com.nuc.zb.controler.UserAction3" method="{1}">
可以直接以用户的任意一个以user_开头的请求去匹配类中的方法,这种方法需要在package标签中放开严格方法访问:
<package name="user" extends="struts-default" namespace="/user"
strict-method-invocation="false">
未完待续。。。。。。