需求:用户登录后,能在个人页面看到自己的专栏和专栏下的文章。
实现:因为登录时,已经把登录用户信息放入session中,所以直接在页面使用el表达式取出即可。
专栏实体类Category:
public class Category {
private Long cate_id;
private String title;//专栏名称
private User user;//专栏作者
private Set<Article> articles = new HashSet<Article>();
public Long getCate_id() {
return cate_id;
}
public Set<Article> getArticles() {
return articles;
}
public void setArticles(Set<Article> articles) {
this.articles = articles;
}
public void setCate_id(Long cate_id) {
this.cate_id = cate_id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
文章实体类Article:
public class Article {
private Long arti_id;
private String title;//文章标题
private String content;//内容
private String status;//文章状态
private Category category;//专栏分类
public Long getArti_id() {
return arti_id;
}
public void setArti_id(Long arti_id) {
this.arti_id = arti_id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
}
专栏实体类Category的映射文件配置:
<hibernate-mapping package="com.dengtuzi.dtb.domain">
<!-- -->
<class name="Category" table="dtb_category">
<id name="cate_id">
<generator class="native"></generator>
</id>
<property name="title" ></property>
<many-to-one name="user" column="cate_user_id" class="User"></many-to-one>
<set name="articles" >
<key column="arti_cate_id"></key>
<one-to-many class="Article" />
</set>
</class>
</hibernate-mapping>
文章实体类Article的映射文件配置:
<hibernate-mapping package="com.dengtuzi.dtb.domain">
<!-- -->
<class name="Article" table="dtb_article">
<id name="arti_id">
<generator class="native"></generator>
</id>
<property name="title" ></property>
<property name="content" ></property>
<property name="status" ></property>
<many-to-one name="category" column="arti_cate_id" class="Category"></many-to-one>
</class>
</hibernate-mapping>
<!-- 获取专栏以及专栏下的文章 -->
<div id="categories" class="easyui-tree" border=false >
<c:forEach var="cate" items="${loginUser.categories }">
<b><p style="font-size:150%">${cate.title }</p></b>
<c:forEach var="arti" items="${cate.articles }">
<p>${arti.title }</p>
</c:forEach>
</c:forEach><br>
</div>
页面效果(红框内):
同样的方式展示数据,修改成专栏和文章后台管理页面:
<b><span style="display:inline-block;width:70%">专栏名</span> <span style="display:inline-block;width:10%">文章数</span> <span align="center" style="display:inline-block;width:10%">操作</span></b>
</br>
</br>
<c:forEach var="cate" items="${loginUser.categories }">
<p>
<a style="display:inline-block;width:70%">${cate.title }</a>
<a align="center" style="display:inline-block;width:10%">${cate.articles.size() }</a>
<a style="display:inline-block;width:10%">编辑 | 删除</a>
</br></br>
</p>
</c:forEach>
页面效果:
文章管理:
<b><span style="display:inline-block;width:70%">文章</span> <span style="display:inline-block;width:10%">文章类别</span> <span align="center" style="display:inline-block;width:10%">操作</span></b>
</br>
</br>
<c:forEach var="cate" items="${loginUser.categories }">
<c:forEach var="article" items="${cate.articles }">
<p>
<a style="display:inline-block;width:70%">${article.title }</a>
<a align="center" style="display:inline-block;width:10%">${article.category.title }</a>
<a style="display:inline-block;width:10%">编辑 | 删除</a>
</br></br>
</p>
</c:forEach>
</c:forEach>
文章管理页面:
展示功能完成,接下来要给这些隐私页面加点保护,通过拦截器在进入action前拦截不合法的请求并将其重定向到登录页面。
先将专栏管理和文章管理页面放到/WEB-INF/pages/下,然后在struts配置文件中加入配置,通过action访问jsp页面:
<!-- 配置访问权限页面方法-->
<action name="*_page">
<result type="dispatcher">/WEB-INF/pages/{1}.jsp</result>
</action>
/*
* 权限拦截器
* 校验用户是否已经登录
*/
public class LoginInterceptor extends MethodFilterInterceptor{
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
//获得session
Map<String, Object> session = ActionContext.getContext().getSession();
//判断登录标识是否为null
Object user = session.get("loginUser");
if(user != null){
//已登录,继续执行拦截器链
invocation.invoke();
}
//未登陆,拦截跳转到登陆页面
return "toLogin";
}
}
配置拦截器和全局结果集:
<interceptors>
<!-- 配置自定义拦截器 -->
<interceptor name="loginInterceptor" class="com.dengtuzi.dtb.web.interceptor.LoginInterceptor"></interceptor>
<!-- 配置拦截器栈 -->
<interceptor-stack name="newStack">
<interceptor-ref name="loginInterceptor">
<param name="excludeMethods">login</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 设置使用的拦截器栈 -->
<default-interceptor-ref name="newStack"></default-interceptor-ref>
<!-- 配置全局结果集 -->
<global-results >
<result name="toLogin" type="redirect">/login.jsp</result>
</global-results>
测试结果: