在Struts1.1-1.2中如果不想沒有登錄的用戶訪問一些action,可以擴展RequestProcessor,并重載processProprocess方法,在其中進行驗證
public class CustomRequestProcessor
extends RequestProcessor {
protected boolean processPreprocess (
HttpServletRequest request,
HttpServletResponse response) {
HttpSession session = request.getSession(false);
//If user is trying to access login page
// then don't check
if( request.getServletPath().equals("/loginInput.do")
|| request.getServletPath().equals("/login.do") )
return true;
//Check if userName attribute is there is session.
//If so, it means user has allready logged in
if( session != null &&
session.getAttribute("userName") != null)
return true;
else{
try{
//If no redirect user to login Page
request.getRequestDispatcher
("/Login.jsp").forward(request,response);
}catch(Exception ex){
}
}
return false;
}
}
相應的,在struts-config.xml中加入controller元素
<controller>
<set-property property="processorClass"
value="com.sample.util.CustomRequestProcessor"/>
</controller>
但剛才看到在Struts1.3中,已經不再使用RequestProcessor,而是用ComposableRequestProcessor 來實現自定義的request響應。
三個@Entity類Tc, Tracer, Track是三向關聯的的表, @Embeddable類TcTracer則存儲著三個表的ForeignKey
@Entity @Table(name= "tc", catalog="first_hiber") public class Tc { @org.hibernate.annotations.CollectionOfElements @JoinTable(name="tc_tracer", joinColumns=@JoinColumn(name="tc_id")) private Set<TcTracer> tcTracers = new HashSet<TcTracer>(); @Id @GeneratedValue @Column(name="tc_id", nullable= false) private Long id; }
@Embeddable @Table(name="tc_tracer") public class TcTracer { @org.hibernate.annotations.Parent private Tc tc;
@ManyToOne(cascade=CascadeType.ALL) @JoinColumn(name="tracer_id", nullable=false, updatable=false) private Tracer tracer; @ManyToOne(cascade=CascadeType.ALL) @JoinColumn(name="track_id", nullable=false, updatable=false) private Track track; }
如上,將TcTracer作為Tc的子元素,從而實現Tc的三相關聯。
用HQL可以通過特定的Tc,Tracer得到對應的所有Track:
select tctracers.track from Tc tc join tc.tcTracers tctracers where tc.name="tc name" and tctracers.tracer.name="tracer name"
List<Track> tracks = session.createQuery(HQL).list();