之前一直做的是php开发,在我的认知里,我认为php在小项目中能起到很大的作用,因为他的门槛很低,随手都能echo两句,还能即时显示。但是如果到了数据量很大的情况下,php的并发性能大家可以搜一搜,所在在业务数据处理等一方面,我认为java还是略胜一筹。我对Servlet也不是很熟悉,这里只是入门,帮助大家能够快速进入到java web开发当中。
我使用的是idea,版本是14.1.1,打开idea,新建工程。左侧选择spring项目,在右侧勾选MVC,security,struts2,hibernate,在勾选完hibernate后选择创建默认配置文件。然后点击下一步,为工程起名,完成后等待idea默认下载依赖包。
在第二步中我们勾选了创建默认配置,同时它会在主目录下创建Main.java,我们将Main.class改名为HibernateUtils.java。
接下来我们对Spring这个容器进行ioc测试,我在src目录下新建一个test包,然后在test包中创建一个TestService。
代码如下:
package test; /** * Created by gavin on 15-6-18. */ public class TestService { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } public void hello() { System.out.println("hello "+ getName()); } }
接下来,我们在web/WEB-INF目录下的applicationContext.xml文件中写入以下内容
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean class="test.TestService" id="testService"> <property name="name" value="spring"></property> </bean> </beans>
接着,我们再在test包下创建一个Test.java文件,内容为:
package test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; /** * Created by gavin on 15-6-18. */ public class Test { public static void main(String[] args) { ApplicationContext ac = new FileSystemXmlApplicationContext("web/WEB-INF/applicationContext.xml"); TestService ts = (TestService)ac.getBean("testService"); ts.hello(); } }
运行test,如果输出为 hello spring 则配置正确。
接下来,我们让spring接管HIbernate的配置文件,在applicationContext中配置以下内容
<!-- data connection --> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/nwu"></property> <property name="username" value="root"/> <property name="password" value="xxxx"/> </bean> <!-- session factory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.connection.url">jdbc:mysql://localhost:3306/xxx</prop> <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop> </props> </property> </bean>
可能会缺少commons-dbcp2-2.1.jar和mysql-connector-java-5.1.26-bin.jar和commons-pool2-2.4.1.jar包,我们在网上下载一个jar包加入到工程中,怎么加呢?点击FIle,打开Project structure,点击Libraries,加入jar包。
在src下创建bean包。
这时候,在左下方有一个类似电影胶片的小框,点击小框,选择Persistence,打开后右击sessionFactory,选择最下面的generate persistence mapping。
关于database方面我就不讲l,网上教程很多,也很简单。这时候按照我上面的配置,点击OK。
这时候idea就会在bean包下创建对应的bean和配置文件,同时在applicationContext.xml中添加对应配置。
接下来,我们新建一个service包,在service包中新建一个接口,名为Address.java,内容为:
package Service; import bean.Addresslist; /** * Created by gavin on 15-6-18. */ public interface Address { public void add(Addresslist al); }
之后我们service包中新建一个Address的实现类AddressImpl,内容为:
package Service; import bean.Addresslist; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; /** * Created by gavin on 15-6-18. */ public class AddressImpl implements Address{ @Qualifier("sessionFactory") @Autowired private SessionFactory sessionFactory; @Override public void add(Addresslist al) { Session s = sessionFactory.openSession(); Transaction tx= s.beginTransaction(); s.save(al); tx.commit(); } public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } }
其中sessionFactory和set方法是依靠spring自动加入的,快捷键是alt+insert
我们在刚才的test文件中写入以下代码:
package test; import Service.Address; import Service.AddressImpl; import bean.Addresslist; import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; /** * Created by gavin on 15-6-18. */ public class Test { public static void main(String[] args) { ApplicationContext ac = new FileSystemXmlApplicationContext("web/WEB-INF/applicationContext.xml"); Address ail = (AddressImpl)ac.getBean("address"); Addresslist al = new Addresslist(); al.setName("xiaozhang"); al.setPhone("123456"); ail.add(al); } }
运行main函数,打开mysql看是否存入相应数据,存入就表示成功。
在web/WEB-INF文件夹下的web.xml文件中加入以下内容:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <!--context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>*.form</url-pattern> </servlet-mapping--> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> <!--old function--> <!--filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class--> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 以下3项参数与log4j的配置相关 --> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/log4j.properties</param-value> </context-param> <context-param> <param-name>log4jRefreshInterval</param-name> <param-value>60000</param-value> </context-param> <listener> <listener-class> org.springframework.web.util.Log4jConfigListener </listener-class> </listener> <!-- end --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/applicationContext.xml</param-value> </context-param> </web-app>
在src目录下新建action包,添加AddressAction.java,内容为:
package action; import Service.AddressImpl; import bean.Addresslist; import com.opensymphony.xwork2.ActionSupport; import org.springframework.beans.factory.annotation.Autowired; /** * Created by gavin on 15-6-18. */ public class AddressAction extends ActionSupport{ private String name; private String phone; @Autowired private AddressImpl address; public void setName(String name) { this.name = name; } public void setPhone(String phone) { this.phone = phone; } public String getName() { return name; } public String getPhone() { return phone; } public String add() { Addresslist al = new Addresslist(); al.setName(getName()); al.setPhone(getPhone()); address.add(al); return SUCCESS; } public void setAddress(AddressImpl address) { this.address = address; } }
接着,在src目录下的struts.xml中写入以下内容
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- struts的action配置文件 --> <!-- 将action托管给spring --> <constant name="struts.objectFactory" value="spring" /> <!-- 所有的action都应该放在对应的package下 --> <package name="addresslist" namespace="/addresslist" extends="struts-default"> <action name="add" class="addressAction" method="add"> <result name="success">/index.jsp</result> </action> </package> </struts>
我们在index.jsp中随便写点什么,接下来配置tomcat服务器,这里不做详细介绍。
应该会缺少org.springframework.web-3.0.5.RELEASE.jar和struts2-spring-plugin-2.3.24.jar包,我们下载这两个包并导入项目,这时候启动debug,如果报错则打开project struture ,在Artifacts中点击fix将额外添加的那几个包导入到lib中。
这时候应该会正常启动tomcat,我们输入http://localhost:8080/addresslist/add?name=test&phone=test ,如果显示我们在index.jsp中写的内容,再查看数据库是否录入成功,如果成功,则整个整合过程完毕
整个配置流程还算比较简单,我在测试的时候也报了很多错误,一步一步整合过来的。总结以上,首先先把spring环境搭建起来,测试一下spring 的IOC是否工作。接下来,整合hibernate,将hibenrnate配置信息写入applicationContext中,从数据库中导出一个bean进行测试。最后,加入struts2,在web.xml中配置好拦截器,在struts.xml中设置让spring来接管action的调用。做完这一切,这才是java web的开始,spring容器是一个很好的工具,其中还有很多要去学习的内容。