sshacegi

http://www.ibm.com/developerworks/cn/java/j-acegi3/


一.Hibernate持久化层
1.model:
a.User.java

package com.witbridge.payroll.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.acegisecurity.GrantedAuthority;
import org.acegisecurity.userdetails.UserDetails;

@SuppressWarnings("unchecked")
public class User implements Serializable, UserDetails {
private static final long serialVersionUID = 2289410331437985768L;

private Integer id;
private String username;
private String password;
private String email;
private boolean enabled;
private boolean accountExpired;
private boolean accountLocked;
private boolean credentialsExpired;
private Integer associateId;
private List roles = new ArrayList();

//~============================getter & settter
public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public boolean isAccountExpired() {
return accountExpired;
}

public void setAccountExpired(boolean accountExpired) {
this.accountExpired = accountExpired;
}

public boolean isAccountLocked() {
return accountLocked;
}

public void setAccountLocked(boolean accountLocked) {
this.accountLocked = accountLocked;
}

public boolean isCredentialsExpired() {
return credentialsExpired;
}

public void setCredentialsExpired(boolean credentialsExpired) {
this.credentialsExpired = credentialsExpired;
}

public void setEnabled(boolean enabled) {
this.enabled = enabled;
}

public void setPassword(String password) {
this.password = password;
}

public void setUsername(String username) {
this.username = username;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public List getRoles() {
return roles;
}

public void setRoles(List roles) {
this.roles = roles;
}

public void addRole(Role role) {
roles.add(role);
}

public GrantedAuthority[] getAuthorities() {
return (GrantedAuthority[]) roles.toArray(new GrantedAuthority[0]);
}

public String getPassword() {
return password;
}

public String getUsername() {
return username;
}

public boolean isAccountNonExpired() {
return !isAccountExpired();
}

public boolean isAccountNonLocked() {
return !isAccountLocked();
}

public boolean isCredentialsNonExpired() {
return !isCredentialsExpired();
}

public boolean isEnabled() {
return enabled;
}

public Integer getAssociateId() {
return associateId;
}

public void setAssociateId(Integer associateId) {
this.associateId = associateId;
}
}

Role.java
package com.witbridge.payroll.model;

import java.io.Serializable;

import org.acegisecurity.GrantedAuthority;


public class Role implements Serializable, GrantedAuthority {

private static final long serialVersionUID = -3187100981785730494L;

private Integer id;
private String name;

//~=================================Constructor
public Role() {
}
public Role(Integer id, String name) {
this.id = id;
this.name = name;
}

//~=================================getter & setter
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

public String getAuthority() {
return name;
}
}

UserRole:
package com.witbridge.payroll.model;

import java.io.Serializable;

public class UserRole implements Serializable {
private static final long serialVersionUID = 3627077608786533159L;

private Integer userId;
private Integer roleId;

public Integer getRoleId() {
return roleId;
}

public void setRoleId(Integer roleId) {
this.roleId = roleId;
}

public Integer getUserId() {
return userId;
}

public void setUserId(Integer userId) {
this.userId = userId;
}

}

测试的Demo:Person.java
package com.witbridge.payroll.model;

public class Person {
private Integer id;
private String username;
private String password;

public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}

}


2.Hibernate映射文件
0.数据源的配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
<!-- DataSource definition -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="COM.ibm.db2.jdbc.net.DB2Driver" />
<property name="url" value="jdbc:db2:192.168.0.120:payrolla" />
<property name="username" value="db2admin" />
<property name="password" value="db2admin" />
</bean>
<!--
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/payroll1" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
-->
<!-- Hibernate SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingDirectoryLocations">
<list> <value>classpath:/com/witbridge/payroll/hbm</value> </list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.DB2Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>

<!-- Transaction manager for a single Hibernate SessionFactory -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>

</beans>


a.user.hbm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="com.witbridge.payroll.model">
<class name="User" table="user" lazy="false">
<id name="id" column="id">
<generator class="identity" />
</id>

<property name="username" column="username" />
<property name="password" column="password" />
<property name="email" column="email" />
<property name="enabled" column="enabled" />
<property name="accountExpired" column="account_expired" />
<property name="accountLocked" column="account_locked" />
<property name="credentialsExpired" column="credentials_expired" />
<property name="associateId" column="associate_id"></property>
</class>
</hibernate-mapping>

b.role.hbm


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="com.witbridge.payroll.model">
<class name="Role" table="role" lazy="false">
<id name="id" column="id">
<generator class="native" />
</id>

<property name="name" column="name" />

</class>
</hibernate-mapping>

c.user_role.hbm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="com.witbridge.payroll.model">
<class name="UserRole" table="user_role" lazy="false">
<composite-id>
<key-property name="userId" column="user_id"/>
<key-property name="roleId" column="role_id"/>
</composite-id>
</class>
</hibernate-mapping>

d.person.hbm

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping package="com.witbridge.payroll.model">
<class name="Person" table="PERSON" schema="DB2ADMIN" lazy="false">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="identity"></generator>
</id>
<property name="username" type="java.lang.String">
<column name="USERNAME" length="10" />
</property>
<property name="password" type="java.lang.String">
<column name="PASSWORD" length="10" />
</property>
</class>
</hibernate-mapping>


二.Spring的业务方法层
1.PersonService.java

package com.witbridge.payroll.service;
import java.util.List;

import org.acegisecurity.annotation.Secured;
import org.springframework.transaction.annotation.Transactional;

import com.witbridge.payroll.model.Person;
@Transactional
public interface PersonService {

@Secured("ADMIN")
public String addAssociate(Person person);

@Transactional(readOnly=true)
@Secured({"ADMIN","HR"})
public List<Person> findAllPerson();

public Person findPersonById(Integer id);

public void delete(Integer id);

public void updatePerson(Person person);
}


2.PersonServiceImpl.java



package com.witbridge.payroll.service.impl;

import java.util.List;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.witbridge.payroll.model.Person;
import com.witbridge.payroll.service.PersonService;

public class PersonServiceImpl extends HibernateDaoSupport implements PersonService {

public String addAssociate(Person person) {
getHibernateTemplate().saveOrUpdate(person);
return person.getUsername();
}

@SuppressWarnings("unchecked")
public List<Person> findAllPerson() {
String hql="from Person";
return getHibernateTemplate().find(hql);
}

public Person findPersonById(Integer id) {
return (Person) getHibernateTemplate().load(Person.class, id);
}

public void delete(Integer id) {
String hql="delete from Person where id=?";
getHibernateTemplate().bulkUpdate(hql, id);

}

public void updatePerson(Person person) {
getHibernateTemplate().update(person);

}

}


3.Spring的service注入 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans default-autowire="byName">
<!-- Auto proxy driven by JDK 5+ Annotation -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />

<bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
<property name="transactionInterceptor" ref="transactionInterceptor" />
</bean>

<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributeSource">
<bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource"/>
</property>
</bean>



<!--payroll group:Business manager definitions ,需要的dao采用自动装配,并将service类实例化提供给action -->
<bean id="userManager" class="com.witbridge.payroll.service.impl.UserManagerImpl" />
<bean id="personService" class="com.witbridge.payroll.service.impl.PersonServiceImpl"/>
<bean id="roleService" class="com.witbridge.payroll.service.impl.RoleServiceImpl"/>

</beans>

三.Spring的acegi:
1.service: package com.witbridge.payroll.service;

import org.acegisecurity.userdetails.UserDetailsService;
import org.springframework.transaction.annotation.Transactional;


@Transactional
public interface UserManager extends UserDetailsService {

}



2.serviceimpl:

package com.witbridge.payroll.service.impl;

import java.util.List;

import org.acegisecurity.userdetails.UserDetails;
import org.acegisecurity.userdetails.UsernameNotFoundException;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.witbridge.payroll.model.User;
import com.witbridge.payroll.service.UserManager;

public class UserManagerImpl extends HibernateDaoSupport implements UserManager {

public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException, DataAccessException {
//get user by username
String hql = "from User u where u.username=?";
List list = getHibernateTemplate().find(hql, username);
if (list.isEmpty()) {
throw new UsernameNotFoundException("Username:" + username + " not found!");
}

User user = (User) list.get(0);

//get user's roles
hql = "select new Role(r.id, r.name) from UserRole ur, Role r where ur.userId=? and ur.roleId=r.id";
List roles = getHibernateTemplate().find(hql, user.getId());
user.setRoles(roles);

return user;
}

}

3.acegi的配置 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

<bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy">
<property name="filterInvocationDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/** *//**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,securityContextHolderAwareRequestFilter,rememberMeProcessingFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor
</value>
</property>
</bean>

<!-- ================================================== Filters definition ===================================================-->
<!-- the filters have three sepatate parts:ProcessingFilter, FilterSecurityInterceptor,ProviderManager-->

<!-- save the username and password in the securityContext -->
<bean id="httpSessionContextIntegrationFilter" class="org.acegisecurity.context.HttpSessionContextIntegrationFilter"/>

<bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter">
<constructor-arg value="/login.jsp"/> <!-- URL redirected to after logout -->
<constructor-arg>
<list>
<ref bean="rememberMeServices"/>
<bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler"/>
</list>
</constructor-arg>
<property name="filterProcessesUrl" value="/logout" />
</bean>

<bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
<property name="authenticationManager" ref="authenticationManager"/>
<property name="authenticationFailureUrl" value="/login.jsp?error=true"/>
<property name="defaultTargetUrl" value="/login.do?method=login"/>
<property name="filterProcessesUrl" value="/login"/>
<property name="rememberMeServices" ref="rememberMeServices"/>
</bean>

<bean id="securityContextHolderAwareRequestFilter" class="org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter"/>

<bean id="rememberMeProcessingFilter" class="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter">
<property name="authenticationManager" ref="authenticationManager"/>
<property name="rememberMeServices" ref="rememberMeServices"/>
</bean>

<bean id="anonymousProcessingFilter" class="org.acegisecurity.providers.anonymous.AnonymousProcessingFilter">
<property name="key" value="acegi_anonymous"/>
<property name="userAttribute" value="anonymousUser,ANONYMOUS"/>
</bean>

<bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">
<property name="authenticationEntryPoint">
<bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
<property name="loginFormUrl" value="/"/>
<property name="forceHttps" value="false"/>
</bean>
</property>
<property name="accessDeniedHandler">
<bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl">
<property name="errorPage" value="/common/accessDenied.jsp"/>
</bean>
</property>
</bean>






<!-- payroll group:整个security配制只需要改变此处,对您开发的url进行访问权限控制,基本格式为:/目录名/页面名称*=权限名 -->
<bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
<property name="authenticationManager" ref="authenticationManager"/>
<property name="accessDecisionManager" ref="accessDecisionManager" />
<property name="objectDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/associate/**=FD,ADMIN

/**=IS_AUTHENTICATED_ANONYMOUSLY <!-- must be the last line -->
</value>
</property>
</bean>


<!-- ========================================== End filters definition =========================================== -->

<!-- Authentication Manager -->
<bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
<property name="providers">
<list>
<ref local="daoAuthenticationProvider"/>
<bean class="org.acegisecurity.providers.anonymous.AnonymousAuthenticationProvider">
<property name="key" value="acegi_anonymous"/>
</bean>
<bean class="org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider">
<property name="key" value="acegi_rememberme"/>
</bean>
</list>
</property>
</bean>

<!-- userDetailsService通过注入的方式进行权限验证 -->
<bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
<property name="userDetailsService" ref="userManager"/>
<property name="userCache" ref="userCache" />
</bean>
<bean id="userCache" class="org.acegisecurity.providers.dao.cache.EhCacheBasedUserCache">
<property name="cache">
<bean class="org.springframework.cache.ehcache.EhCacheFactoryBean">
<property name="cacheManager">
<bean class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"/>
</property>
<property name="cacheName" value="userCache"/>
</bean>
</property>
</bean>

<!-- Access Decision Manager -->
<bean id="accessDecisionManager" class="org.acegisecurity.vote.AffirmativeBased">
<property name="decisionVoters">
<list>
<bean class="org.acegisecurity.vote.RoleVoter">
<property name="rolePrefix" value="" />
</bean>
<bean class="org.acegisecurity.vote.AuthenticatedVoter"/>
</list>
</property>
<property name="allowIfAllAbstainDecisions" value="false"/>
</bean>

<!-- RememberMe Service,save the user's messages into Cookies -->
<bean id="rememberMeServices" class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices">
<property name="userDetailsService" ref="userManager"/>
<property name="key" value="acegi_rememberme"/>
</bean>

<!-- =======================Method Security Interceptor Driven by Annotation Auto Proxy ============================== -->
<!-- This bean has been defined in applicationContext-service.xml!
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
-->


<bean class="org.acegisecurity.intercept.method.aopalliance.MethodDefinitionSourceAdvisor" autowire="constructor" />

<bean id="methodSecurityInterceptor" class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">
<property name="validateConfigAttributes" value="true" />
<property name="authenticationManager" ref="authenticationManager" />
<property name="accessDecisionManager" ref="accessDecisionManager" />
<property name="objectDefinitionSource">
<bean class="org.acegisecurity.intercept.method.MethodDefinitionAttributes">
<property name="attributes"><bean class="org.acegisecurity.annotation.SecurityAnnotationAttributes" />
</property>
</bean>
</property>
</bean>

</beans>

四.struts
1.web.xml: <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<!-- load the Spring xml files -->

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext-*.xml
</param-value>
</context-param>

<!-- Spring Context Listener -->

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>


<!-- Encoding Filter -->
<filter>
<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
<url-pattern>/**//*</url-pattern>
</filter-mapping>

<!-- Acegi Filter -->
<filter>
<filter-name>Acegi Filter Chain Proxy</filter-name>
<filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>
<init-param>
<param-name>targetClass</param-name>
<param-value>org.acegisecurity.util.FilterChainProxy</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Acegi Filter Chain Proxy</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


<!-- Struts Config -->
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

<!-- Session time out(minute) definition -->
<session-config>
<session-timeout>30</session-timeout>
</session-config>

<!-- Welcome file difinition -->
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>

<!-- Error pages -->
<error-page>
<error-code>500</error-code>
<location>/common/error.jsp</location>
</error-page>

</web-app>


2.struts-config.xml <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>
<!-- payroll group:add your form-beans -->
<form-beans>

<form-bean name="personForm" type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="person" type="com.witbridge.payroll.model.Person"></form-property>
</form-bean>

<form-bean name="roleForm" type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="role" type="com.witbridge.payroll.model.Role"></form-property>
</form-bean>

</form-beans>


<global-exceptions />

<global-forwards />



<!-- payroll group:add your action mappings -->
<action-mappings>

<action path="/login"
type="com.witbridge.payroll.action.LoginAction"
parameter="method">
<forward name="mainPage" path="/associate/person.jsp" />
</action>

<action path="/person"
type="com.witbridge.payroll.action.PersonAction"
name="personForm"
parameter="method"
scope="request"
validate="false"
input="/person.jsp">
<forward name="success" path="/associate/person.jsp" />
<forward name="findAll" path="/associate/findPerson.jsp"></forward>
<forward name="onePerson" path="/associate/onePerson.jsp"></forward>
<forward name="failure" path="/person.jsp" />
</action>

<action path="/role"
type="com.witbridge.payroll.action.RoleAction"
name="roleForm"
parameter="method"
scope="request"
validate="false"
input="/manage/createroll.jsp">
<forward name="success" path="/manage/createsuccess.jsp" />
<forward name="failure" path="/manage/failure.jsp" />
</action>





</action-mappings>


<!-- apply Delegate Model for Spring Framework -->
<controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor" />

<message-resources parameter="com.witbridge.payroll.resource.ApplicationResources" null="false" />

<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml, /WEB-INF/validation.xml"/>
</plug-in>



</struts-config>


3.action: package com.witbridge.payroll.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.acegisecurity.context.SecurityContextHolder;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.witbridge.payroll.common.BaseDispatchAction;
import com.witbridge.payroll.model.User;

public class LoginAction extends BaseDispatchAction {

public ActionForward login(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {

User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();


request.getSession().setAttribute("user", user);

return mapping.findForward("mainPage");
}

}

package com.witbridge.payroll.action;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import org.apache.struts.validator.DynaValidatorForm;

import com.witbridge.payroll.model.Person;
import com.witbridge.payroll.service.PersonService;


public class PersonAction extends DispatchAction {
//通过注入方式得到bean,action中一定要有set方法
private PersonService personService;

public void setPersonService(PersonService personService) {
this.personService = personService;
}

public ActionForward addPerson(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {

DynaValidatorForm personForm = (DynaValidatorForm) form;
Person person=(Person) personForm.get("person");
String success=personService.addAssociate(person);

if(success!=null) { return mapping.findForward("success"); }

else return mapping.findForward("failure");
}

public ActionForward getAllPerson(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
List personList=new ArrayList();
personList=personService.findAllPerson();
request.setAttribute("personList", personList);
return mapping.findForward("findAll");
}

public ActionForward getPersonById(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
Integer id=new Integer(request.getParameter("id"));
Person person=new Person();
person=personService.findPersonById(id);
request.setAttribute("person", person);
return mapping.findForward("onePerson");
}


public ActionForward updatePerson(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
DynaValidatorForm personForm = (DynaValidatorForm) form;
Person person=(Person) personForm.get("person");
System.out.println(person.getId());
personService.updatePerson(person);
return mapping.findForward("success");
}


}


4.spring接管action的配置 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans default-autowire="byName">

<!--payroll group: action definitions -->
<!-- 采用delegate方式装配action ,并且所需service类也自动装配,不用getBean方式去获得-->
<bean name="/login" class="com.witbridge.payroll.action.LoginAction"/>
<bean name="/person" class="com.witbridge.payroll.action.PersonAction"/>
<bean name="/role" class="com.witbridge.payroll.action.RoleAction" />


</beans>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值