在java中需要实现页面与Servlet的数据传递:
1、创建web包,存放Servlet
2、为了安全,创建公共服务层接口BaseService
3、创建service包,存放服务层接口,当然肯定有实现类包
4、创建servlet,配置web.xml
5、创建文件夹jsp,并新建jsp页面
6、编写servlet里doget、dopost方法
一、创建web包后,想到安全,所以去创建公共的服务层接口
和BaseDao公共数据操作方法的接口差不多,在服务层做一些优化,例如返回修改成功。
创建一个序列化的接口:T表示实体类,K表示实体类里的主键类型(表内的标识符)
public interface BaseService<T,K extends Serializable> {
List<T> selectAll(); //查询表内的所有数据,并返回到实体类集合list中
T findById(int id); //根据id查询出数据,返回到实体类T中
String update(T t); //得到一个实体类对其进行修改操作
String insert(T t); //得到一个实体类对其进行新增操作
String deleteById(int id); //根据一个id查询出数据,对其进行删除操作
}
二、创建service包后:
service包内的接口就是因dao包内的接口而存在,所以创建IUserService,里面和IUserDao接口一样,除非要进行返回值的优化等;
public interface IUserService extends BaseService<User, Integer> {
User findByUsernameAndPassword(String username, String password);
}
有了接口,肯定需要对应的实现类,存放在service.impl包内,创建UserServiceImpl实现类,实现接口IUserService。
实现类里:根据IUserDao接口new出实现类UserDaoImpl();
private IUserDao userDao=new UserDaoImpl();
方法更是简单,例如:
public List<User> selectAll() {
return userDao.selectAll();
}
对于增删改操作,例如新增:
public String update(User t) {//返回字符串
if (userDao.update(t)>0) {//返回值为新增改变的行数,大于0都是新增成功
return "修改成功!";
}
else {
return "修改失败!";
}
}
其余都是如此。
三、在web包内创建UserServlet类,继承HttpServle,实现doget,dopost方法;
之后找到WebRoot目录下的WEB-INF目录下的web.xml进行配置。
在 <display-name></display-name>下配置<servlet></servlet>标签
在标签内需要配置两个参数:
和自己创建的Servlet名称一样
<servlet-name>UserServlet</servlet-name>
文件所在路径
<servlet-class>com.test.web.UserServlet</servlet-class>
最后配置mapping:
<servlet-mapping>
和自己创建的Servlet名称一样
<servlet-name>UserServlet</servlet-name>
网页访问的路径,可以随意写,但建议有规则的写
<url-pattern>/servlet/UserServlet</url-pattern>
</servlet-mapping>
四、配置完后,创建jsp文件夹,在内创建demo.jsp页面:
可以使用JSP 标准标签库:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
Java Server Pages 标准标签库 (JSTL) 包含的各种标签可用于 JSP 页面中。
JSTL 的优点:
提供一组标准标签
可用于编写各种动态 JSP 页面
用于访问数据库、有条件地执行代码和支持国际化
还有可以使用 EL表达式:
EL 为表达式语言(Expression Language),可以简化对变量的对象的访问
语法 :
E
L
E
x
p
r
e
s
s
i
o
n
所
有
的
表
达
式
以
”
{EL Expression}所有的表达式以”
ELExpression所有的表达式以”{”开始,以”}”结束。
使用c标签获取路径:
<c:set value="${pageContext.request.contextPath}" scope="page" var="ctx"></c:set>
五、编写servlet里doget、dopost方法
1、doget方法可直接使用doPost(req, resp);传到dopost执行请求
2、在dopost内查询出所有数据,并传到页面:
//实例化服务层实现类
UserServiceImpl impl=new UserServiceImpl();
//实例化一个User实体类集合
List<User> users= new ArrayList<User>();
users = impl.selectAll();//调用服务层查询user表所有数据的方法
User user = new User();//实例化一个实体类
if (req.getParameter("username")!=null) {//判断姓名不为空,添加数据进实体类
user.setUsername(req.getParameter("username"));
//不止名字,其余的都可以进行判断不为空才添加
user.setUserid(Integer.parseInt(req.getParameter("userid")));
user.setPassword(req.getParameter("password"));
users.add(user);//将实体类添加进集合
}
req.setAttribute("users",users);//在这个请求中存储一个属性users
//转发到页面 转发属性(数据)共享 请求地址不变
req.getRequestDispatcher("/jsp/demo.jsp").forward(req, resp);
在这个请求中存储一个属性
//重定向 转发属性(数据)不共享 请求地址变
//resp.sendRedirect("/20190511/servlet/UserServlet");
3、在demo.jsp页面中调用users里数据
<table border="1px" width="300px" height="100px" bgColor="#ffff80"
align="center">
<tbody>
<tr><th>用户id</th><th>姓名</th><th>密码</th></tr>
<tr>
使用c:forEach标签 遍历用el表达式获取到的users,遍历的每一个都赋值给变量user
<c:forEach items="${users}" var="user">
<tr>
<td>${user.userid}</td>
<td>${user.username }</td>
<td>${user.password }</td>
</tr>
</c:forEach>
</tbody>
</table>
除了普通的变量还有分割遍历,将items内的字符串,根据delims内的字符串分割,并赋值给变量var内的item,使用el表达式输出
<c:forTokens items="A,B,C,D,E,F,G" delims="," var="item">
分割${item}<br>
</c:forTokens>