好吧,过去三天了,上个双休日碰到个妇女节和聚餐,基本就没有敲代码,又是逛街又是通宵的。今天抽个空,把一些东西想写的继续写点。这回就不写这么详细了,挑一些重点和我调试时候的蛋疼点吧,以备不时之需。
1.dao,model,service之分
在当初,创建这三个包时,就是为了降低耦合性,将一些类似于重复赋值的工作都交给了applicationContext来做了。我们着重在搞清楚整个程序的业务逻辑结构上。
在model中包含所需要用的的实体类,包括了每一个实体类对数据库的对应连接,这些实体类,在以后的业务逻辑中会用到,因为在网站上会有登录注册之类的,都需要用到实体类;
在dao中包含着实体类和数据库数据的衔接,实体类中的每一个变量都对应着数据库中的每一列,当需要增删改查时,通过dao来进行对数据的操作,因为要降低耦合度,所以会将dao中的类进行提取接口,在service类中,创建dao类的接口类,比如,在dao中是UserDao.java和IUserDao.java,在Service类中调用时,则声明
private IUserDao userDao;
并在applicationContext中申明一个Bean,在bean中说明
<bean id="userService" class="service.UserService">
<property name="userDao" ref="UserDAO"></property>
</bean>
id是以后要调用这个函数时要用到的,class是这个类所在地位置,property中的name是该类中的userDao,而ref中的UserDao是在applicationContext中的userdao的id名。
<bean id="userService" class="service.UserService">
<property name="userDao" ref="UserDAO"></property>
</bean>
通过这种方式,只需要修改applicationContext中的bean中的property中的ref就能修改类中调用的类,从而降低了耦合度;
在service中包含着业务逻辑所要调用数据库数据的代码,比如包含login的用户名和密码的核对,通过调用userDao中的查找函数,找到后,进行核对,再返回值。通常也是提取了接口类,以降低耦合度。
2.session
因为以前学的太渣,知道session的存在,但是不知道怎么用了,所以开始搜索相关资料。
主要是用到了数据的传输以及用户的跟踪。
通过在业务逻辑类中,调用session,并设置关键字和值,来将值传送到网页中,虽然在sturts中的<s:property value="username"/>也能进行数据传送,但是这个不是持续性的,只能一次性将网站的信息传给业务逻辑类或者将业务逻辑类的数据传送给网站,而且必需在业务逻辑层中设置username的get和set方法,如果数据一多,那就比较苦恼了。所以还是采用下session。
在业务逻辑层中设置session值有两种方式:
方式一:
HttpSession session = null;
session.setAttribute("key", "value");
在这里,感觉和map差不多,都是关键字和值对应的方式,调用时,通过调用关键字就能得到值了。
方式二:
ActionContext.getContext().getSession()
.put("key", "value");
但是这里的“key”和“value”都必须是String值。
在网页上设置session值:
<%session.setAttribute("username", null); %>
这个将session中的username值设置为空。
在业务逻辑层中提取session值:
String username = ActionContext.getContext().getSession()
.get("username").toString();
这其实跟设置session值没有太大的差别,还有一种就省了。
在网站中提取session值,以下是判定用户是否已经登陆的代码,感觉比较实用的:
<%
if (session.getAttribute("username") == null) {
%>
你没有登录
<br>
<a href="Login.jsp">请登录.</a>
<%
} else {
%>
<%=session.getAttribute("username").toString()%>
登录成功。
<%
}
%>
3.将数据库中的数据提取到网页中
通过struts的iterator来实现:
点击后通过struts调转到业务层,在业务层进行查找后,显示在网页上:
点击以下链接
<a href="user.action">查看别的用户</a>
设置struts.xml中的userInfo的action:
<!-- 查看用户 -->
<action name="user" class="user">
<result name="success">/User.jsp</result>
</action>
在applicationContext中设置:
<bean id="user" class="action.UserAction">
<property name="userService" ref="userService"></property>
</bean>
<bean id="userService" class="service.UserService">
<property name="userDao" ref="UserDAO"></property>
</bean>
UserAction.java:
public class UserAction {
private User user;
private IUserService userService;
private List<User> users;
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public IUserService getUserService() {
return userService;
}
public void setUserService(IUserService userService) {
this.userService = userService;
}
public String execute(){
System.out.println("调用execute");
users=userService.findAll();
if(users==null){
return "fail";
}else{
System.out.println(users.isEmpty());
return "success";
}
}
}
userService.java:
public List<User> findAll() {
return userDao.findAll();
}
网页中调用
<center>
<h3>查看别的用户</h3>
<hr>
<table border="1">
<tr>
<td>id</td>
<td>UserName</td>
<td>sex</td>
<td>phone</td>
</tr>
<s:iterator value="users" var="user">
<tr>
<td align="center"><s:property value="#user.id" /></td>
<td align="center"><s:property value="#user.username" /></td>
<td align="center"><s:property value="#user.sex" /></td>
<td align="center"><s:property value="#user.phone" /></td>
</tr>
</s:iterator>
</table>
<a href="LoginSuccess.jsp">返回</a>
</center>
最后的效果是:
就写这么多吧,发现还有很多需要学习。好好学习,天天向上了。