Java框架:Spring + Strust 2 实例

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中的类与数据库中的表对应起来,并实现对数据库表进行增删改查的操作。
dao

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初始页面
s

然后在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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_43751710

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值