Java框架:Spring + Strust 2 实例
Spring简介
功能:处理控制业务(负责对数据库的操作)
核心:bean
配置文件:applicationContext.xml
Struts 2简介
功能:负责表示层的显示
核心:action
配置文件:struts.xml(需在web.xml中配置)
在web.xml中添加filter及相应的filter-mapping
示例
Web示例:
第一步:建立dao包(对应Spring)
dao包中对应的是基础的对象如user,实现的是访问数据库的功能。
dao是最基础的,与数据库连接在一起,将Java中的类与数据库中的表对应起来,并实现对数据库表进行增删改查的操作。
Xuser类(id,name,age及对应的getter、setter)
注意:getter、setter方法是必须有的,配置文件applicationContext.xml是通过getter、setter方法来给实例赋值,即下图中的getId()方法等
public class Xuser
{
private int id;
private String name;
private int age;
public int getId()
{
return id;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public void setId(int id)
{
this.id = id;
}
public void setName(String name)
{
this.name = name;
}
public void setAge(int age)
{
this.age = age;
}
}
BaseDao接口
定义了增删改查等操作数据库的方法
import java.util.List;
public interface BaseDao
{
public boolean insert(int id, String name, int age) throws Exception;
public boolean delete(int id) throws Exception;
public boolean update(int id, String name, int age) throws Exception;
public List select() throws Exception;
public Object select(int id) throws Exception;
}
XuserDao类
对数据库中的Xuser对象(对应具体表中一行)进行具体的操作。
这里以select为例:
DataSource是数据源,通过DataSource来连接数据库。(它的实例化是在applicationContext.xml中进行)
JdbcTemplate是操作模板,通过它来执行SQL语句。
package dao;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
public class XuserDao implements BaseDao
{
private DataSource dataSource;
private JdbcTemplate jdbcTemplateObject;
/*private String url = "jdbc:mysql://221.235.53.167:3306/gttest";
private String user = "gttest";
private String password = "gttest0319";*/
public void setDataSource(DataSource dataSource)
{
this.dataSource = dataSource;
this.jdbcTemplateObject = new JdbcTemplate(dataSource);
}
@Override
public boolean insert(int id, String name, int age) throws Exception
{
/*Class.forName("com.mysql.jdbc.Driver");
String sql = "insert into xuser(xuser_id,xuser_name,xuser_age)Values(?,?,?)";
Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement pst = conn.prepareStatement(sql);
pst.setInt(1, id);
pst.setString(2, name);
pst.setInt(3, age);
int i = pst.executeUpdate();
if (i >= 1)
{
return true;
}
else
{
return false;
}*/
String SQL = "insert into xuser(xuser_id,xuser_name,xuser_age)Values(?,?,?)";
jdbcTemplateObject.update(SQL, id, name, age);
System.out.println("Created Record Name = " + name + " Age = " + age);
return true;
}
@Override
public boolean delete(int id) throws Exception
{
/*Class.forName("com.mysql.jdbc.Driver");
String sql = "delete from xuser where xuser_id=?";
Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement pst = conn.prepareStatement(sql);
pst.setInt(1, id);
int i = pst.executeUpdate();
if (i >= 1)
{
return true;
}
else
{
return false;
}*/
String SQL = "delete from xuser where xuser_id=?";
jdbcTemplateObject.update(SQL, id);
System.out.println("Deleted Record with ID = " + id);
return true;
}
@Override
public boolean update(int id, String name, int age) throws Exception
{
/*Class.forName("com.mysql.jdbc.Driver");
String sql = "update xuser set xuser_name=?,xuser_age=? where xuser_id=?";
Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement pst = conn.prepareStatement(sql);
pst.setString(1, name);
pst.setInt(2, age);
pst.setInt(3, id);
int i = pst.executeUpdate();
if (i >= 1)
{
return true;
}
else
{
return false;
}*/
String SQL = "update xuser set xuser_name=?,xuser_age=? where xuser_id=?";
jdbcTemplateObject.update(SQL, name, age, id);
System.out.println("Updated Record with ID = " + id);
return true;
}
//select all
@Override
public List<Xuser> select() throws Exception
{
/*ArrayList<Xuser> al = new ArrayList();
Class.forName("com.mysql.jdbc.Driver");
String sql = "select * from xuser";
Connection conn = DriverManager.getConnection(url, user, password);
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sql);
while (rs.next())
{
Xuser x = new Xuser();
x.setId(rs.getInt("xuser_id"));
x.setAge(rs.getInt("xuser_age"));
x.setName(rs.getString("xuser_name"));
al.add(x);
}
return al;*/
String SQL = "select * from xuser";
List<Xuser> xusers = jdbcTemplateObject.query(SQL, new XuserMapper());
return xusers;
}
@Override
public Xuser select(int id) throws Exception
{
/*Xuser Get = new Xuser();
Class.forName("com.mysql.jdbc.Driver");
String sql = "select * from xuser where xuser_id=?";
Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement pst = conn.prepareStatement(sql);
pst.setInt(1, id);
ResultSet rs = pst.executeQuery();
if (rs.next())
{
Get.setId(rs.getInt("xuser_id"));
Get.setName(rs.getString("xuser_name"));
Get.setAge(rs.getInt("xuser_age"));
}
else
System.out.print("没有该用户");
return Get;*/
String SQL = "select * from xuser where xuser_id=?";
Xuser xuser = jdbcTemplateObject.queryForObject(SQL, new Object[] { id }, new XuserMapper());
return xuser;
}
}
XuserMapper类
是将定义的Xuser类与数据库中的表对应起来,一个Xuser对象就相当于表中一行
package dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
public class XuserMapper implements RowMapper<Xuser>
{
public Xuser mapRow(ResultSet rs, int rowNum) throws SQLException
{
Xuser user = new Xuser();
user.setId(rs.getInt("xuser_id"));
user.setName(rs.getString("xuser_name"));
user.setAge(rs.getInt("xuser_age"));
return user;
}
}
Goods类
package dao;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Goods
{
private int id;
private String name;
private int price;
private int xuser_id;
}
GoodsDao类
package dao;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
public class GoodsDao implements BaseDao
{
private DataSource dataSource;
private JdbcTemplate jdbcTemplateObject;
public void setDataSource(DataSource dataSource)
{
this.dataSource = dataSource;
this.jdbcTemplateObject = new JdbcTemplate(dataSource);
}
public boolean insert(int id, String name, int price, int xuser_id) throws Exception
{
String SQL = "insert into goods(goods_id,goods_name,goods_price,xuser_id)Values(?,?,?,?)";
jdbcTemplateObject.update(SQL, id, name, price, xuser_id);
System.out.println("Created Record Name = " + name + " Age = " + price);
return true;
}
@Override
public boolean delete(int id) throws Exception
{
String SQL = "delete from goods where goods_id=?";
jdbcTemplateObject.update(SQL, id);
System.out.println("Deleted Record with ID = " + id);
return true;
}
@Override
public boolean update(int id, String name, int price) throws Exception
{
String SQL = "update goods set goods_name=?,goods_price=? where goods_id=?";
jdbcTemplateObject.update(SQL, name, price, id);
System.out.println("Updated Record with ID = " + id);
return true;
}
//select all
@Override
public List<Goods> select() throws Exception
{
String SQL = "select * from goods";
List<Goods> goods = jdbcTemplateObject.query(SQL, new GoodsMapper());
return goods;
}
@Override
public List select(int id) throws Exception
{
String SQL = "select * from goods where xuser_id=?";
List<Goods> goods = jdbcTemplateObject.query(SQL, new Object[] { id }, new GoodsMapper());
return goods;
}
@Override
public boolean insert(int id, String name, int age) throws Exception
{
// TODO Auto-generated method stub
return false;
}
}
GoodsMapper类
package dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
public class GoodsMapper implements RowMapper<Goods>
{
public Goods mapRow(ResultSet rs, int rowNum) throws SQLException
{
Goods goods = new Goods();
goods.setId(rs.getInt("goods_id"));
goods.setName(rs.getString("goods_name"));
goods.setPrice(rs.getInt("goods_price"));
goods.setXuser_id(rs.getInt("xuser_id"));
return goods;
}
}
配置文件applicationContext.xml
applicationContext.xml的文件默认在src下(如果没有,就自己建一个),但是可以在web.xml中配置它的位置,在web.xml中:
dao包中的类在实例化时,不使用new,而是通过Spring架构的bean来实现,也就是在applicationContext.xml中写如下语句。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://221.235.53.167:3306/gttest?characterEncoding=utf8"/>
<property name="username" value="gttest"/>
<property name="password" value="gttest0319"/>
</bean>
<bean id="xuserdao" class="dao.XuserDao">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="goodsdao" class="dao.GoodsDao">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="goods" class="dao.Goods"></bean>
<bean id="user" class="dao.Xuser"></bean>
<bean id="baseaction" class="actions.BaseAction">
<property name="xuserdao" ref="xuserdao"/>
<property name="user" ref="user"/>
</bean>
</beans>
bean中即实例化的对象,如:
<bean id="xuserdao" class="dao.XuserDao">
<property name="dataSource" ref="dataSource" />
</bean>
即是一个XuserDao的对象。
id="xuserdao"即它的id是xuserdao。
class="dao.XuserDao"是说它是XuserDao类。
<property name="dataSource" ref="dataSource" />
意思是XuserDao的dataSource这个参数被赋值了,赋值的内容是另一个id为dataSource的对象
这里,我们需要使用XuserDao的实例,但XuserDao实例化需要另一个实例化的对象——dataSource,所以需要两个bean。
第二步:测试上述程序——连接数据库
建立一个MainApp的测试类
使用如下语句获取applicationContext.xml中定义的实例(bean)
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
XuserDao xuserdao = (XuserDao) context.getBean("xuserdao");
通过ApplicationContext类获取applicationContext.xml中信息,通过ApplicationContext类的方法获取applicationContext.xml中的实例化对象(bean)
package service;
import java.util.List;
import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import dao.Goods;
import dao.GoodsDao;
import dao.Xuser;
import dao.XuserDao;
public class MainApp
{
private static Logger logger = Logger.getLogger(MainApp.class);
public static void main(String[] args)
{
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
XuserDao xuserdao = (XuserDao) context.getBean("xuserdao");
try
{
System.out.println("------Listing Multiple Records--------");
List<Xuser> xusers = xuserdao.select();
for (Xuser record : xusers)
{
System.out.print("ID : " + record.getId());
System.out.print(", Name : " + record.getName());
System.out.println(", Age : " + record.getAge());
}
logger.info("select all");
System.out.println("----Updating Record with ID = 2 -----");
xuserdao.update(12345, "xiao", 20);
logger.info("update one");
System.out.println("----Listing Record with ID = 2 -----");
Xuser student = xuserdao.select(12345);
System.out.print("ID : " + student.getId());
System.out.print(", Name : " + student.getName());
System.out.println(", Age : " + student.getAge());
logger.info("select one");
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
GoodsDao goodsdao = (GoodsDao) context.getBean("goodsdao");
try
{
goodsdao.delete(1234567);
goodsdao.insert(1234567, "Python实践", 80, 12345678);
System.out.println("------Listing Multiple Records--------");
List<Goods> goods = goodsdao.select();
for (Goods record : goods)
{
System.out.print("ID : " + record.getId());
System.out.print(", Name : " + record.getName());
System.out.print(", Price : " + record.getPrice());
System.out.println(", Xuser : " + record.getXuser_id());
}
logger.info("select all");
System.out.println("----Updating Record with ID = 2 -----");
goodsdao.update(1234567, "Python实践", 75);
logger.info("update one");
System.out.println("----Listing Record with ID = 2 -----");
goods = goodsdao.select(12345678);
for (Goods record : goods)
{
System.out.print("ID : " + record.getId());
System.out.print(", Name : " + record.getName());
System.out.print(", Price : " + record.getPrice());
System.out.println(", Xuser : " + record.getXuser_id());
}
logger.info("select one");
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
// MemCachedManager cache = MemCachedManager.getInstance();
// cache.memcachedPut("11111", "asdfasfa");
// System.out.print("get value : " + cache.memcachedGet("11111"));
logger.info("----交易日志,日志级别info----->" + "hello world" + "<--------");
}
}
结果为
第三步:建立actions包
actions包对应的是服务器与客户端的交互,实现的是处理客户端请求的功能(如客户端点击查询,对应的查询action便执行查询操作,并返回给客户端查询结果)
actions包中有许多action类,action类一般需要继承ActionSupport类(这样更加规范)
BaseAction(有查询action)
BaseAction代码如下图
1、首先是接收客户端浏览器传来的信息——id:
HttpServletRequest request = ServletActionContext.getRequest();//struts 2 exists
String g = request.getParameter("id");
int id = Integer.parseInt(g);
注意使用ServletActionContext.getRequest()需要有Strut 2的架构,具体的Strut 2配置文件见后文。
2、要想实现查询的功能,需要使用XuserDao中对数据库的查询功能。
3、返回查询的结果,这里涉及到session和JSONObject,具体方法见后文
package actions;
import java.io.IOException;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.interceptor.SessionAware;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.alibaba.fastjson.JSONObject;
import com.opensymphony.xwork2.ActionSupport;
import dao.Xuser;
import dao.XuserDao;
public class BaseAction extends ActionSupport implements SessionAware
{
private XuserDao xuserdao;
private Xuser user;
private Map session;
private static Logger logger = LoggerFactory.getLogger(BaseAction.class);
@Action(value = "selectusers", results = { @Result(name = "success", location = "/success.jsp", type = "redirect"), @Result(name = "error", location = "/error.jsp") })
public Xuser select()
{
HttpServletRequest request = ServletActionContext.getRequest();//struts 2 exists
String g = request.getParameter("id");
int id = Integer.parseInt(g);
try
{
user = xuserdao.select(id);
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return user;
}
@Action(value = "baseaction", results = { @Result(name = "success", location = "/success.jsp"), @Result(name = "error", location = "/error.jsp") })
//success的result中缺少 type = "redirect",可能会出现重复朱注册的现象
public String select_name()
{
HttpServletRequest request = ServletActionContext.getRequest();//struts 2 exists
String g = request.getParameter("id");
int id = 0;
if (this.session.isEmpty())
{
if (g != null)
id = Integer.parseInt(g);
}
else
{
user = (Xuser) this.session.get("user1");
id = user.getId();
}
try
{
user = xuserdao.select(id);
if (user == null)
return "error";
this.session.put("user1", user);
}
catch (Exception e)
{
// TODO Auto-generated catch block
logger.error(g, e);
e.printStackTrace();
}
HttpServletResponse response = ServletActionContext.getResponse();
try
{
JSONObject res = new JSONObject();
res.put("name", user.getName());
res.put("age", user.getAge());
if (user.getName() == null)
return "error";
response.setCharacterEncoding("utf-8");
// PrintWriter out = response.getWriter();
// out.print(user.getName());
// out.print(user.getAge());
// out.flush();
// out.close();
// response.getWriter().write(user.getName());
// response.getWriter().write(user.getAge());
response.getWriter().write(res.toString());
}
catch (IOException e)
{
// TODO Auto-generated catch block
logger.error(g, e);
e.printStackTrace();
}
return "success";
}
public int select_age(int id)
{
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
XuserDao ope = (XuserDao) context.getBean("xuserdao");
Xuser user = (Xuser) context.getBean("user");
try
{
user = ope.select(id);
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return user.getAge();
}
public XuserDao getXuserdao()
{
return xuserdao;
}
public void setXuserdao(XuserDao xuserdao)
{
this.xuserdao = xuserdao;
}
public Xuser getUser()
{
return user;
}
public void setUser(Xuser user)
{
this.user = user;
}
public Map getSession()
{
return session;
}
public void setSession(Map session)
{
this.session = session;
}
}
GoodsAction类
package actions;
import java.io.PrintWriter;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lombok.Getter;
import lombok.Setter;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import dao.Goods;
import dao.GoodsDao;
import dao.Xuser;
@ParentPackage("json-default")
public class GoodsAction extends ActionSupport
{
@Getter
@Setter
private GoodsDao goodsdao;
@Getter
@Setter
private Goods goods;
private List<Goods> all_goods = new LinkedList();
private JSONArray jsonarray = new JSONArray();
private Map session;
private static Logger logger = LoggerFactory.getLogger(BaseAction.class);
@Action(value = "select_all_goods")
public String select()
{
try
{
all_goods = goodsdao.select();
HttpServletResponse response = ServletActionContext.getResponse();
JSONArray jsonarray = JSONArray.fromObject(all_goods);
response.getWriter().write(jsonarray.toString());
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return SUCCESS;
}
@Action(value = "selectgoods", results = { @Result(type = "json") })
//, params = { "JSONArray", "jsonarray" }
//success的result中缺少 type = "redirect",可能会出现重复朱注册的现象
public String select_one()
{
session = ActionContext.getContext().getSession();
Object obj = session.get("user1");
Xuser user = (Xuser) obj;
System.out.println(user.getId());
try
{
all_goods = goodsdao.select(user.getId());
for (Goods record : all_goods)
{
System.out.print("ID : " + record.getId());
System.out.print(", Name : " + record.getName());
System.out.print(", Price : " + record.getPrice());
System.out.println(", Xuser : " + record.getXuser_id());
}
if (all_goods == null)
return "error2";
}
catch (Exception e)
{
// TODO Auto-generated catch block
logger.error(user.getName(), e);
e.printStackTrace();
}
HttpServletResponse response = ServletActionContext.getResponse();
try
{
int n = 0;
for (Goods record : all_goods)
{
JSONObject object = new JSONObject();
object.put("goods_id", record.getId());
object.put("goods_name", record.getName());
object.put("goods_price", record.getPrice());
jsonarray.add(object);
System.out.println(object);
}
//JSONArray jsonarray = JSONArray.fromObject(all_goods);
if (all_goods == null)
return "error";
response.setCharacterEncoding("utf-8");
// PrintWriter out = response.getWriter();
// out.print(user.getName());
// out.print(user.getAge());
// out.flush();
// out.close();
// response.getWriter().write(user.getName());
// response.getWriter().write(user.getAge());
//response.getWriter().write(jsonarray.toString());
PrintWriter out = response.getWriter();
out.print(jsonarray);
out.flush();
out.close();
}
catch (Exception e)
{
// TODO Auto-generated catch block
logger.error(user.getName(), e);
e.printStackTrace();
}
return SUCCESS;
}
@Action(value = "insertgoodsa", results = { @Result(type = "json") })
public void insert()
{
session = ActionContext.getContext().getSession();
Object obj = session.get("user1");
Xuser user = (Xuser) obj;
System.out.println(user.getId());
HttpServletRequest request = ServletActionContext.getRequest();
// String g = request.getParameter("goods");
// System.out.println(g);
// JSONObject gg = JSONObject.fromObject(g);
//System.out.println("insert");
String sid = request.getParameter("goods_id");
String sname = request.getParameter("goods_name");
String sprice = request.getParameter("goods_price");
goods.setId(Integer.parseInt(sid));
goods.setXuser_id(user.getId());
goods.setName(sname);
goods.setPrice(Integer.parseInt(sprice));
System.out.print("ID : " + goods.getId());
System.out.print(", Name : " + goods.getName());
System.out.print(", Price : " + goods.getPrice());
System.out.println(", Xuser : " + goods.getXuser_id());
try
{
goodsdao.insert(goods.getId(), goods.getName(), goods.getPrice(), goods.getXuser_id());
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
HttpServletResponse response = ServletActionContext.getResponse();
try
{
response.setCharacterEncoding("utf-8");
JSONObject object = new JSONObject();
object.put("ms", "yes");
PrintWriter out;
out = response.getWriter();
out.print(object);
out.flush();
out.close();
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Action(value = "insertgoods", results = { @Result(type = "json") })
public void insertgoods()
{
HttpServletRequest request = ServletActionContext.getRequest();//struts 2 exists
String sid = request.getParameter("goods_id");
String sname = request.getParameter("goods_name");
String sprice = request.getParameter("goods_price");
int id = Integer.parseInt(sid);
int price = Integer.parseInt(sprice);
String name = sname;
session = ActionContext.getContext().getSession();
Object obj = session.get("user1");
Xuser user = (Xuser) obj;
int xuser_id = user.getId();
try
{
// goodsdao.insert(1, "1", 1, xuser_id);
goodsdao.insert(id, name, price, xuser_id);
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
HttpServletResponse response = ServletActionContext.getResponse();
try
{
response.setCharacterEncoding("utf-8");
JSONObject object = new JSONObject();
object.put("ms", "yes");
System.out.println(object.getString("ms"));
PrintWriter out;
out = response.getWriter();
out.print(object);
out.flush();
out.close();
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
logger.error(user.getName(), e);
}
// PrintWriter out;
// try
// {
// out = response.getWriter();
// out.print(jsonarray);
// out.flush();
// out.close();
// }
// catch (IOException e)
// {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
}
session
session是服务器端对用户信息的存储,与浏览器中的cookie对应,两者一般联合起来使用。
在这里,使用了session将user的信息保存了下来:
this.session.put(“user1”, user);
这样使用的前提是:扩展了接口SessionAware,定义了Map类session,实现了session的getter和setter方法
public class BaseAction extends ActionSupport implements SessionAware
private Map session;
JSONObject
在返回查询结果时,最好使用JSONObject
JSONObject res = new JSONObject();
res.put("name", user.getName());
res.put("age", user.getAge());
response.getWriter().write(res.toString());
JSON与map类似。
其实通过session就可以得到用户的信息,这里只是举个例子
index.jsp初始页面
然后在web.xml中设置初始页面为index.jsp
index.jsp的主要内容如下,
中,说明了提交表单时(点击按钮时)对应的action是"baseaction"<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!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>
This is my JSP page. <br>
<form action="baseaction" method="post">
<label for="id">Please enter your id</label><br/>
<input type="text" name="id"/>
<input type="submit" value="查询"/>
</form>
</body>
</html>
structs.xml配置文件
那么服务器端怎么知道"baseaction"是谁呢?
这是通过structs.xml文件来实现的。
在使用structs.xml文件前,需要在web.xml中设置其信息。建立structs2的filter及filter-mapping
structs.xml文件如下
其中
<action name="baseaction"
class="actions.BaseAction"
method="select_name">
定义了"baseaction"对应的类是"actions.BaseAction",对应的方法是"select_name"。
而后/success.jsp
定义了如果"select_name"方法返回的是"success",那么跳转到页面success.jsp
<?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>
<constant name="struts.devMode" value="true" />
<package name="actions" extends="struts-default">
<!-- <action name="baseaction" -->
<!-- class="actions.BaseAction" -->
<!-- method="select_name"> -->
<!-- <result name="success">/success.jsp</result> -->
<!-- <result name="error">/error.jsp</result> -->
<!-- </action> -->
</package>
</struts>
log4j2.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN" monitorInterval="30">
<appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="[%-5p][%-d{yy-MM-dd HH:mm:ss.SSS}][%t][%l]%m%n"/>
</Console>
<File name="log" fileName="D:/test.log" append="false">
<PatternLayout pattern="[%-5p][%-d{yy-MM-dd HH:mm:ss.SSS}][%t][%l]%m%n"/>
</File>
<RollingFile name="log.error" append= "true" fileName="D:/baseaction_error.log" filePattern="D:/baseaction_error.log.%i">
<PatternLayout pattern="[%-5p][%-d{yy-MM-dd HH:mm:ss.SSS}][%t][%l]%m%n"/>
<SizeBasedTriggeringPolicy size="50MB"/>
<DefaultRolloverStrategy max="100" fileIndex="min"/>
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingFile>
<RollingFile name="log.MemCacheManager" append= "true" fileName="D:/MemCacheManager.log" filePattern="D:/MemCacheManager.log.%i">
<PatternLayout pattern="[%-5p][%-d{yy-MM-dd HH:mm:ss.SSS}][%t][%l]%m%n"/>
<SizeBasedTriggeringPolicy size="50MB"/>
<DefaultRolloverStrategy max="100" fileIndex="min"/>
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingFile>
</appenders>
<loggers>
<logger name="actions.MemCacheManager" level="DEBUG">
<appender-ref ref="log.MemCacheManager" />
</logger>
<logger name="actions.BaseAction" level="DEBUG">
<appender-ref ref="log.error" />
</logger>
<!--建立一个默认的root的logger-->
<root level="INFO">
<appender-ref ref="log.error"/>
<appender-ref ref="console"/>
<appender-ref ref="log" />
</root>
</loggers>
</configuration>
success.jsp页面
在浏览器接收到服务器返回的response后,又是如何将response中用户的信息显示出来的呢?
这涉及到taglib标签,在success.jsp页面中加入:
<%@ taglib prefix=“s” uri="/struts-tags"%>
便可以使用taglib标签
随后添加如下语句:
name: <s:property value=“user.name”/>
age: <s:property value="#session.user1.age"/>
"user.name"便是JOSN中返回的name
"#session.user1.age"便是session中存储的user的age
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<script type="text/javascript"
src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.1.js"></script>
<title>My JSP 'CURD.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>
<p>hello! <s:property value="user.name"/><br></p>
age: <s:property value="#session.user1.age"/><br>
goods:
<table border="1" id="goodstable">
<tr>
<th>ID</th>
<th>商品名称</th>
<th>价格</th>
</tr>
<tbody id="content_table_body"><!-- 动态查询的数据显示的数据 对tbody进行操作-->
</tbody>
</table>
<button id="select" onclick="select()"> 查询</button>
<div>
<form method="post">
<!-- action="insertgoods" -->
<label for="goods">Please enter your goods information</label><br/>
<input type="text" id="goods_id" name="goods_id"/><br/>
<input type="text" id="goods_name" name="goods_name"/><br/>
<input type="text" id="goods_price" name="goods_price"/><br/>
<input type="button" value="添加商品" onclick="insert()"/>
<!-- -->
</form>
</div>
<script type="text/javascript">
function select() {
// $("p").append("Some appended text.");
// document.getElementById("goodstable").innerHTML="ss";
$.ajax({
type : "post",
url : 'selectgoods',
dataType : "json",//设置需要返回的数据类型
success : function(data) {
// alert(data+'\n'+data[1].goods_name+'\n'+data.length);
// var json=eval("("+data+")");//解析json数据
var head="<tr><th>序号</th><th>ID</th><th>商品名称</th><th>价格</th></tr>";
var list="";//自定义的拼接字符串函数,高效。
// list+="<tr>";
// list+="<td>"+"第"+1+"件"+"</td>";
// list+="<td>"+data[1].goods_id+"</td>";
// list+="<td>"+data[1].goods_name+"</td>";
// list+="<td>"+data[1].goods_price+"</td>";
// list+="</tr>";
$.each(data,function(i,actObj){//i表示循环的下标,actObj表示循环的对象,可自定义名字
list+="<tr>";
list+="<td>"+"第"+(i+1)+"件"+"</td>";
list+="<td>"+actObj.goods_id+"</td>";
list+="<td>"+actObj.goods_name+"</td>";
list+="<td>"+actObj.goods_price+"</td>";
list+="</tr>";
});
$("#goodstable").html(head+list);
//document.getElementById("goodstable").innerHTML=head+list;
},
error : function() {
alert("服务器没有返回数据");
}
});
}
function insert(){
alert($("#goods_id").val());
//alert("数据");
$.ajax({
type:"post",
async:false,
cache:false,
url:'insertgoods',
dataType:"json",
data:{"goods_id": $("#goods_id").val(),
"goods_name":$("#goods_name").val(),
"goods_price":$("#goods_price").val(),
//"id":"#session.user1.id"
"id":"12345678"
},
success:function(data){
alert(data.ms+"duis");
if(data.ms=="yes")
select();
},
error : function() {
alert("服务器没有返回数据");
},
// success: function (response, textStatus, jqXHR) {
// if (!!response) {
// if (response.isSuccess) {
// alert("保存数据成功");
// }
// else {
// if (!!response.msg) {
// alert("保存数据失败", response.msg);
// } else {
// alert("保存数据失败");
// }
// }
// }
// }
}
);
}
</script>
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>Struts 2 Web Application</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
WEB-INF/classes/applicationContext.xml
</param-value>
</context-param>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>WEB-INF/classes/log4j2.xml</param-value>
</context-param>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>